逆波兰计算器实现

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

实现过程

  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());
    }
}

运行结果:

 

posted @ 2021-12-23 11:35  活在记忆里的人  阅读(55)  评论(0编辑  收藏  举报