逆波兰表达式


一、前缀、中缀、后缀表达式

1.前缀表达式

从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的俩个数,用运算符对它们做相应的计算(栈顶元素 和 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。

在这里插入图片描述

2.中缀表达式

中缀表达式就是常见的运算表达式

3.后缀表达式(逆波兰表达式)

从左至右扫描表达式,遇到数组时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算**(次顶元素和栈顶元素)**,并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。

在这里插入图片描述

二、逆波兰计算器

1.要求及思路分析

在这里插入图片描述
中缀表达式转换为后缀表达式
在这里插入图片描述

在这里插入图片描述

2.代码实现

代码如下(示例):

package Day06;

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 -";
        //(3+4)*5-6
        //说明为了方便,逆波兰表达式的数字和符号使用空格隔开
        //思路:
        /*
         * 1、先将表达式放到ArrayList中
         * 2、将ArrayList传给一个方法,遍历,配合栈完成计算
         *
         * */
            List<String> rpnList = getListString(suffixExpression);
        System.out.println("rpnList = " + rpnList);
        int res = calculate(rpnList);
        System.out.println("计算的结果是:" + res);
    }

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

        //完成对逆波兰表达式的计算
    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("-")){
                    res = num1 - num2;
                }else if(item.equals("*")){
                    res = num2*num1;
                }else if(item.equals("/")){
                    res = num1/num2;
                }else{
                    throw new RuntimeException("输入的运算符有误");
                }
                //把res入栈
                stack.push(res + "");
            }
        }
        //最后留在stack中的数据就是结果
        return Integer.parseInt(stack.pop());
    }

    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值