计算后缀表达式、Java

来源:互联网 发布:word mac版 编辑:程序博客网 时间:2024/05/21 21:41

后缀表达式为二叉树中的后序遍历后写出的表达式
以例题为例子,
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;    }}