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;
        }
    }
    
    
  • 相关阅读:
    hdu 1312 Red and Black
    hdu 1573 X问题
    广工校赛决赛之简单的数论题
    最大的LeftMax与rightMax之差绝对值
    POJ 2385 Apple Catching
    hdu 1171 Big Event in HDU
    ACM比赛经验
    BestCoder Valentine's Day Round
    使用ffmpeg进行视频封面截取
    使用ODP.NET连接Oracle数据库
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/13797858.html
Copyright © 2011-2022 走看看