zoukankan      html  css  js  c++  java
  • 栈实现后缀表达式计算

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

    思路分析

    • 例如:(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
    ",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;
        }
    }
    
    
  • 相关阅读:
    如何基于Azure平台实现MySQL HA(方法论篇)
    如何对Azure磁盘性能进行测试
    Azure底层架构的初步分析
    聊聊Azure的安全性
    关于Azure带宽的测试
    JavaScript 优化
    SQL时间段查询
    win7+64位+Oracle+11g+64位下使用PLSQL+Developer+的解决办法
    putty 使用方法,中文教程
    怎样才能专心工作
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/13797858.html
Copyright © 2011-2022 走看看