1. 程式人生 > >計算字尾表示式、Java

計算字尾表示式、Java

字尾表示式為二叉樹中的後序遍歷後寫出的表示式
以例題為例子,
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;
    }

}