• 逆波兰计算器实现


    前缀表达式又称为波兰表达式,后缀表达式又称为逆波兰表达式

    实现过程

      1、输入一个逆波兰表达式(后缀表达式),使用栈(Stack),计算其结果

      2、支持小括号和多位数,本例简化为支持对整数计算

      3、思路分析:

        还是以(3+4)*5-6为例,其对应后缀表达式为3 4 + 5 * 6 -

        1.从左到右扫描,将3和4压入栈(4为栈顶元素,3为次顶元素),

        2.遇到+运算符,计算3+4d的值,为7并将7压入栈;

        3.将5入栈

        4.遇到*运算符,弹出5和7,计算结果为35,将35压入栈;

        5.将6入栈

        6.最后是-运算符,弹出35和6,计算出35-6得到最终结果29。

    代码实现

    package com.atxihua;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Stack;
    
    public class PolandNotation {
        public static void main(String[] args) {
            //先定义给逆波兰表达式
            //测试
            //说明为了方便,逆波兰表达式的数字和符号使用空格隔开
            String suffixExpression="3 4 + 5 * 6 -";//29
            /*
             * 思路
             * 先将 suffixExpression 放到ArrayList中
             * 将ArrayList传递给一个方法,遍历ArrayList配合栈 完成计算
             * */
            List<String> list=getListString(suffixExpression);
            System.out.println("rpnList="+list);
            int res=calculate(list);
            System.out.println("计算的结果是:"+res);
    
        }
        //将一个逆波兰表达式,依次将数据和运算符放入到ArrayList中
        public static List<String> getListString(String suffixExpression){
            //将suffixExpression分隔,注意" "之间有空格
            String[] split=suffixExpression.split(" ");
            List<String> list=new ArrayList<>();
            for(String ele:split){
                list.add(ele);
            }
            return list;
        }
    
        /*
         * 完成对逆波兰表达式的运算
         * 从左只右扫描,将3和4压入堆栈
         * 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值等于7,再将7入栈
         * 将5入栈
         * 接下来是*(乘)运算符,因此弹出5和7,计算得到结果35,再将35入栈
         * 将6入栈
         * 最后是-运算符,计算35-6的值,即29,由此得到最终结果
         * */
        public static int calculate(List<String> ls){
            //创建一个栈即可
            Stack<String> stack=new Stack<String>();
            //遍历ls
            for(String item:ls){
                //这里使用正则表达式来取出数
                if(item.matches("\\d+")){
                    //匹配的是多位数
                    //入栈
                    stack.push(item);
                }else{
                    //pop出两个数,并运算,再入栈
                    int num2=Integer.parseInt(stack.pop());
                    int num1=Integer.parseInt(stack.pop());
                    int res=0;
                    if(item.equals("+")){
                        res=num1+num2;
                    }else if(item.equals("-")){
                        //注意num2比num1先出栈,所以是num1-num2
                        res=num1-num2;
                    }else if(item.equals("/")){
                        res=num1/num2;
                    }else if(item.equals("*")){
                        res= num1*num2;
                    }else {
                        throw new RuntimeException("运算符有误");
                    }
                    //把res入栈
                    stack.push(""+res);
                }
            }
            //最后留在栈中的是计算结果
            return Integer.parseInt(stack.pop());
        }
    }

    运行结果:

  • 相关阅读:
    找出MySQL库中设计不好的Schemas并修复
    【转载】分享一个查看分析Oracle表空间使用情况的脚本
    SQLServer比较两个数据库的对象
    如何修复处于recovery挂起状态的数据库
    哪些因素会影响sqlserver shrink的速度
    mysql 修改字段长度
    ASP.NET CORE 发布时不编译Views文件夹
    HTTP Error 500.19 Internal Server Error 错误解决方案 (0x8007000d)
    Sql Prompt 10下载安装破解图文教程
    a标签不会下载txt文件的问题
  • 原文地址:https://www.cnblogs.com/ftx3q/p/15722748.html
Copyright © 2020-2023  润新知