【leetcode】150 逆波兰表达式求值

本文详细介绍了逆波兰表达式的概念及其求值过程,包括从后缀表达式到中缀表达式的转换策略。通过一个具体的示例1+2*3/2-5,解释了如何将中缀表达式转化为后缀表达式,并提供了相应的代码实现,用于计算逆波兰表达式。该算法使用栈来处理操作数和运算符,遵循运算符优先级规则进行计算。
摘要由CSDN通过智能技术生成

题目来源

150. 逆波兰表达式求值

image-20220718120022828

思路

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

  • 中缀 1 + 2 * 3
  • 后缀 1 2 3 + *

我们需要将逆波兰表达式化为正常可计算的中缀表达式,再进行计算。题目所给的参数是后缀表达式,其操作的思路如下:

  • 遇到操作数,入栈
  • 遇到运算符,取栈顶两个连续数据进行计算,再将计算结果入栈

看起来不难,是因为这道题已经是简化后的版本,其所给后缀表达式中没有出现()这种特殊优先级的操作。下面说一下把中缀转后缀的思路(本题没有涉及)

如何将中缀表达式转为后缀?

以这个中缀表达式为例

1 + 2 * 3 / 2 -5

我们都知道,运算顺序应该是先计算2*3然后在计算6/2,最后计算1+3-5得出结果-1

因为* /操作符的优先级高于加减,这里就需要注意这种情况。我们需要用一个栈来存放操作符

  • 遇到操作数的时候 先输出
  • 遇到操作符,和栈顶进行比较
    • 如果栈为空/操作符优先级高于栈顶,入栈
    • 操作符优先级低于栈顶或和栈顶相同,出栈顶操作符
  • 最后将栈中的操作符全部出栈,就可以获得后缀表达式

用上面这个思路走一遍,即为下面的情况(不知道这样写的大家能不能看明白)

qq_pic_merged_1658118047047

最终得到的结果如下

1 2 3 * 2 / + 5 -

即需要的后缀表达式

我们可以用本题代码测试一下这个用例,得出的结果也是-1,正确!

image-20220718122342759

完整代码

//https://leetcode.cn/problems/evaluate-reverse-polish-notation/submissions/
//150逆波兰表达式
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> s;
        for(auto& ch : tokens)
        {
            if(ch=="+"||ch=="-"||ch=="*"||ch=="/")
            {
                int right=s.top();
                s.pop();
                int left=s.top();
                s.pop();
                switch(ch[0])
                {
                    case '+':
                        s.push(left+right);
                        break;
                    case '-':
                        s.push(left-right);
                        break;
                    case '*':
                        s.push(left*right);
                        break;
                    case '/':
                        s.push(left/right);
                        break;
                    default:
                        break;
                }
            }
            else{
                s.push(stoi(ch));
            }   
        }
        return s.top();
    }
};

Snipaste_2022-07-18_11-20-17

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕雪华年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值