栈--后缀表达式求值

后缀表达式也称为逆波兰表达式,即运算符写在后面

  • 从左向右进行计算

  • 不必考虑运算符优先级,即不用包含括号

示例

输入:tokens = ["2","1","+","3","*"]
输出:9
即:(2 + 1) * 3

输入:tokens = ["4","13","5","/","+"]
输出:6
即:4 + (13 / 5)

题目假设

  • 数字都视为整数

  • 数字和运算符个数给定正确,不会有除零发生

 

/*
什么叫中缀、后缀?
答:  1 + 2  :中缀
	  1 2 +  :后缀

	"4","13","5","/","+"
    
	第一步:	| 5 | ----顶部
			| 13|
			| 4 | ----底部
			_____
			
	第二步:	| 5 | ----顶部
			| 13|
			| 4 | ----底部
			
	第三步:	| 5 | ----顶部
			| 13|
			| 4 | ----底部	
		将5、13 pop()出来然后继续“/”操作,将"/"操作后的结果(13/5==2)再压栈
		
	第四步:	|  	| ----顶部
			| 2	|
			| 4 | ----底部		
			_____
		将2、4 pop()出来然后继续“+”操作,将"+"操作后的结果(2+4==6)再压栈
    "4","13","5","/","+"
	第五步:当字符串都执行完毕以后,栈中就只剩下最后的结果值

    - 遇到数字压入栈
    - 遇到运算符, 就从栈弹出两个数字做运算, 将结果压入栈
    - 遍历结束, 栈中剩下的数字就是结果
 */

代码:

public int evalRPN(String[] tokens) {
    LinkedList<Integer> numbers = new LinkedList<>();
    for (String t : tokens) {
        switch (t) {
            case "+" -> {
                Integer b = numbers.pop();
                Integer a = numbers.pop();
                numbers.push(a + b);
            }
            case "-" -> {
                Integer b = numbers.pop();
                Integer a = numbers.pop();
                numbers.push(a - b);
            }
            case "*" -> {
                Integer b = numbers.pop();
                Integer a = numbers.pop();
                numbers.push(a * b);
            }
            case "/" -> {
                Integer b = numbers.pop();
                Integer a = numbers.pop();
                numbers.push(a / b);
            }
            //t是字符串,所以我们要转换成数字再压栈
            default -> numbers.push(Integer.parseInt(t));
        }
    }
    return numbers.pop();
}

另外一种:

public int evalRPN(String[] tokens) {
    LinkedList<Integer> numbers = new LinkedList<>();
    for (String t : tokens) {
        switch (t) {
            case "+" :{
                Integer b = numbers.pop();
                Integer a = numbers.pop();
                numbers.push(a + b);
                break;
            }
            case "-" : {
                Integer b = numbers.pop();
                Integer a = numbers.pop();
                numbers.push(a - b);
                break;
            }
            case "*" : {
                Integer b = numbers.pop();
                Integer a = numbers.pop();
                numbers.push(a * b);
                break;
            }
            case "/" : {
                Integer b = numbers.pop();
                Integer a = numbers.pop();
                numbers.push(a / b);
                break;
            }
            //t是字符串,所以我们要转换成数字再压栈
            default :numbers.push(Integer.parseInt(t));
        }
    }
    return numbers.pop();
}

测试用例:

public static void main(String[] args) {
    String[] tokens={"10","6","9","3","+","-11","*","/","*","17","+","5","+"};
    System.out.println(new E02LetCode150().evalRPN(tokens));
}

参考代码可点击:GitHub - 1693905917/DataStructure: 数据结构与算法

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值