计算后缀表达式、Java

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c_yejiajun/article/details/78383694

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

}

猜你喜欢

转载自blog.csdn.net/c_yejiajun/article/details/78383694