数据结构+算法--逆波兰计算器分析与实现(后缀表达式)

中缀表达式

中缀表达式是一个通用的算术或逻辑公式表示方法, 操作符是以中缀形式处于操作数的中间(例:3 + 4),中缀表达式是人们常用的算术表示方法。

前缀表达式

在这里插入图片描述
在这里插入图片描述

后缀表达式

在这里插入图片描述
在这里插入图片描述

逆波兰计算器实现思路(后缀表达式)

详细思路请参考上面 后缀表达式的计算机求值
在这里插入图片描述

代码实现

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class PolandNotation {
    public static void main(String[] args) {

        //先定义一个逆波兰表达式(后缀表达式)
        //(3+4)*5-60/10  => 3 4 + 5 * 6 -
        //说明:为了方便,逆波兰表达式的 数字和符号 使用空格隔开
        String suffixExpression = "3 4 + 5 * 6 -";   //结果:29

        //思路
        //1.先将"3 4 + 5 * 6 -"放到ArrayList中
        //2.将 ArrayList 传递给一个方法,遍历ArrayList 配合栈 完成计算
        List<String> list = getListByString(suffixExpression);
        int res = calculate(list);
        System.out.println("计算的结果 = "+res);
    }


    //将一个逆波兰表达式,依次将 数据和运算符 放入到 ArrayList 中
    public static List<String> getListByString(String suffixExpression){
        //将 suffixExpression 分割
        String[] split = suffixExpression.split(" ");
        ArrayList<String> list = new ArrayList<>();
        for(String ele : split){
            list.add(ele);
        }
        return list;
    }


    //完成对逆波兰表达式的计算
    /*表达式suffixExpression = "3 4 + 5 * 6 -";
    1.从左至右扫描,将3和4压入数栈
    2.遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈
    3.将5入栈
    4.接下来是*运算符,因此弹出5和7,计算出7*5=35,再将35入栈
    5.将6入栈
    6.最后是-运算符,计算出35-6的值,即29,因此得出最终结果(注意:这里是 35-6 而不是 6-35 是拿栈的 次顶元素-栈顶元素)
     */
    public static int calculate(List<String> ls){
        //创建一个栈,只需要一个栈即可
        Stack<String> stack = new Stack<>();
        //遍历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("-")){
                    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);
            }
        }
        //最后留在stack中的数据是运算结果
        return Integer.parseInt(stack.pop());
    }
}

结果截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值