数据结构之栈三 后缀表达式(逆波兰表达式)运算

数据结构之栈三 后缀表达式运算

一、 后缀表达式是什么?

逆波兰式(Reverse Polish notation,RPN,或逆波兰记法),也叫后缀表达式(将运算符写在操作数之后)
例如:
中缀表达式:3+3*(2+4)-4/2
转化为后缀表达式为:3 3 2 4 + * + 4 2 / -

二、计算步骤

1.将计算的字符串的后缀表达式转化为数组,利于后续的遍历

2.定义一个栈,遍历1中得到的数组,数字入栈,遇到字符,取出栈顶和次顶元素进行运算,并将运算结果入栈

三、代码实现

package demo.sjjg.stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
//后缀表达式运算(逆波兰表达式运算)
public class PolandNotation {
    public static void main(String[] args) {
//        String value="3 6 2 / + 5 + 4 5 * -";//3+6/2+5-4*5=-9
//        String value = "3 4 * 8 - 4 2 / +";//3*4-8+4/2=6
        String value="3 3 2 4 + * + 4 2 / -";//3+3*(2+4)-4/2=19
        List<String> list = getListString(value);
        System.out.println("list=" + list);
        int res=calculate(list);
        System.out.println("结果为:"+res);
    }

    //将字符串转化为list数组利于遍历
    private static List<String> getListString(String value) {
        String[] s = value.split(" ");
        ArrayList<String> list = new ArrayList<>();
        for (String emp:s){
            list.add(emp);
        }
        return list;
    }

    //计算
    private static int calculate(List<String> list) {
        Stack<String> stack = new Stack<>();
        for (String emp:list){
            if (emp.matches("\\d+")){
                stack.push(emp);
            }else {
                int num1= Integer.parseInt(stack.pop());
                int num2= Integer.parseInt(stack.pop());
                int res=0;
                if (emp.equals("+")){
                    res=num1+num2;
                }else if (emp.equals("-")){
                    res=num2-num1;
                }else if (emp.equals("*")){
                    res=num2*num1;
                }else if (emp.equals("/")){
                    res=num2/num1;
                }
                stack.push(""+res);
            }
        }
        return Integer.parseInt(stack.pop());
    }
}

四、结果实现

在这里插入图片描述

总结

本次我们实现了后缀表达式的运算,小伙伴们是不是很好奇那个那个中缀表达式怎样变成后缀表达式啊。小伙伴别着急,带小括号运算和中缀表达式转后缀表达式我们下篇再见。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值