計算字尾表示式、Java
阿新 • • 發佈:2019-01-09
字尾表示式為二叉樹中的後序遍歷後寫出的表示式
以例題為例子,
12 4 + 13 - 6 2 * +=
易知正常順序為
((12+4)-13)+(6*2)
使用棧來解這個問題
//定義棧的介面
public interface IStack<E> {
E push(E item); //入棧
E pop(); //出棧
E peek(); //取棧頂元素
int size(); //返回棧中元素的個數
boolean empty(); //判斷棧是否為空
}
//實現棧的介面
import java.lang.reflect.Array;
public class SeqStack<E> implements IStack<E> {
private int maxsize;
private int top;
private E[] data;
public SeqStack(Class <E> type,int maxsize){
this.maxsize=maxsize;
top=-1; //棧為空top為-1
data = (E[])Array.newInstance(type, maxsize);
}
//入棧
public E push(E item) {
if(!isfull()){
data[++top]=item;
return item;
}
else
return null;
}
//
public E pop() {
if(!empty())
return data[top--];
else
return null;
}
public E peek() {
if(!empty()){
return data[top];
}
else
return null;
}
public int size() {
return top+1;
}
public boolean empty() {
if(top==-1)
return true;
else
return false;
}
public boolean isfull(){
if(top==maxsize-1)
return true;
else
return false;
}
}
public class test {
public static void main(String[] args) {
char [] data={12,4,'+',13,'-',6,2,'*','+'};
SeqStack<Character> ss=new SeqStack<Character>(Character.class,data.length);
for(int i=data.length-1;i>=0;i--){//迴圈將data的資料放入棧內
ss.push(data[i]);
}
//建立一個棧順序表,用於暫時存放從ss取出來的資料
SeqStack<Character> ss0=new SeqStack<Character>(Character.class,data.length);
int result=0;
while(!ss.empty()){
char temp=ss.pop();
ss0.push(temp);
//當棧彈出的字元為運算子,則開始運算
if(temp=='+'||temp=='-'||temp=='*'||temp=='/'){
result =eachOtherAdd(ss0);//呼叫運算方法
while(!ss0.empty()){//將運算結果和原來彈出多餘的資料壓回原來的棧順序表
char temp0=ss0.pop();
ss.push(temp0);
}
}
}
System.out.println(result);
}
//呼叫所彈出的運算子和最後彈出是資料,運算出結果
public static int eachOtherAdd(SeqStack<Character> ss0){
//建立三個char型別來儲存將要計算的資料
char c3=ss0.pop();
int i2=ss0.pop();//將char型別轉換為int型別
int i1=ss0.pop();
int add=0;//建立一個運算後的結果
switch(c3){//判斷運算子
case '+':
add=i1+i2;
break;
case '-':
add=i1-i2;
break;
case '*':
add=i1*i2;
break;
case '/':
add=i1/i2;
break;
}
ss0.push((char)add);
return add;
}
}