栈实现后缀表达式计算

  • 要求: 输入一个逆波兰表达式(后缀表达式),使用栈计算结果
  • 这里简化,这对整数进行计算

思路分析

  • 例如:(3+4)x5-6 对应的后缀表达式就是3 4 + 5 x 6 -,针对后缀表达式求值步骤如下:
    • 从左至右扫描,将3和4压入栈中;
    • 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值7,再将7入栈;
    • 继续扫描,将5入栈;
    • 接下来就是x运算符,因此弹出5和7,计算7x5 = 35,将35入栈
  • 将6入栈;
  • 最后是 - 运算符,计算35-6 = 29的值.

代码实现

public class PolandNotation {
    public static void main(String[] args) {
        String suffixExpression = "30 4 + 5 * 6 -";
        //将后缀表达式保存到ArrayList中
        List<String> list = getListString(suffixExpression);
        //初始化一个栈
        Stack<String> stack = new Stack<>();
        //遍历后缀表达式数组
        for (String s : list) {
            if (s.matches("\\d+")){
                stack.push(s);
            }else {
                //出站两个元素
                int num1 = Integer.parseInt(stack.pop());
                int num2 = Integer.parseInt(stack.pop());
                //计算两个数
                int res = calculate(num1,num2,s);
                //将返回值压栈
                stack.push(""+res);
            }
        }
        System.out.printf("计算结果为:%d\n",Integer.parseInt(stack.pop()));
    }

    /**
     *
     * @param num1 先出栈的数
     * @param num2 后出栈的数
     * @param s 操作符
     * @return 但会两个数运算后的结果
     */
    private static int calculate(int num1, int num2, String s) {
        int res = 0;
        switch (s){
            case "+":
                res = num2 + num1;
                break;
            case "-":
                res = num2 - num1;
                break;
            case "*":
                res = num2 * num1;
                break;
            case "/":
                res = num2 / num1;
                break;
            default:
                break;
        }

        return res;
    }

    /**
     *
     * @param suffixExpression 后缀表达式
     * @return  返回转换后的list数组
     */
    private static List<String> getListString(String suffixExpression) {
        List<String> list = new ArrayList<>();
        String[] s = suffixExpression.split(" ");
        for (String s1 : s) {
            list.add(s1);
        }
        return list;
    }
}

posted @ 2020-10-11 16:22  刘指导  阅读(828)  评论(0编辑  收藏  举报