使用栈计算后缀表达式

package 数据结构;

import java.util.Stack;

/**
 * @program: java_每天一题
 * @description: 使用栈实现逆波兰表达式(后缀表达式)计算器
 *               思路:遇到符号,就弹出两个元素进行运算,将运算结果入栈,继续遍历下一位
 *                    遍历完成后,栈中只有一个元素,即是运算结果
 *
 *               中缀表达式(3+4)*5-6转后缀表达式 3 4 + 5 * 6 -
 * @author: czg
 * @create: 2020-05-16 10:42
 */
public class j_栈_逆波兰表达式_计算器 {
    public static void main(String[] args) {
        System.out.println(evalRPN(new String[]{"1","2", "3", "+","4", "*", "+", "5", "-"}));
    }


    //判断是否是符号
    public static boolean isSign(String sign){
        return "+-*/".contains(sign);
    }

    /**
     * 进行计算
     * @param left 左边数值
     * @param right 右变数字
     * @param sign 运算符
     * @return
     */
    public static int compute(int left,int right,String sign){
        int result=0;
        switch (sign){
            case "+": result=left+right;break;
            case "-": result=left-right;break;
            case "*": result=left*right;break;
            default: result=left/right;break;
        }
        return result;
    }

    public static  int evalRPN(String[] tokens) {

        //创建一个栈
        Stack<Integer> st=new Stack<>();

        for (String token : tokens) {
            //如果遇到符号就弹出栈顶两个数字进行求和
            if(isSign(token)){
                //先右在左数值
                int right=st.pop();
                int left=st.pop();
                //将计算结果放回栈中
                st.push(compute(left,right,token));
            }else {
                //遇到数字直接放到栈中
                st.push(Integer.parseInt(token));
            }
        }
        //当计算完成时,栈中只剩下一个数,即为结果
        return st.pop();
    }
}

猜你喜欢

转载自www.cnblogs.com/czgxxwz/p/12899885.html