150. 逆波兰表达式求值

Problem: 150. 逆波兰表达式求值

思路

本体就是后缀表达式,遍历字符串,如果为数字就直接添加到栈中,如果为操作符,就从栈中弹出两个数字之后,执行运算。

解题方法

1.函数最后放回的是一个int形的结果,我们定义的是long long ,可以直接使用内置函数stoll(),来解决这个问题
2.假如后缀表达式为 [“4”,“13”,“5”,“/”,“+”]
栈顶 -------------------->栈底
13 4
则num1=13
num2=4
对于原式来说,应该执行的是num2+num1,而不是num1-num2

复杂度

时间复杂度:
遍历字符串向量 tokens 的时间复杂度为 O(N),其中 N 是字符串向量的长度。
在每次遍历过程中,我们进行了一系列操作:
检查当前字符串 ch 是否为运算符,这个操作的时间复杂度为 O(1)。
如果是运算符,我们从栈中弹出两个数进行计算,并将结果压入栈中,这个操作的时间复杂度为 O(1)。
如果不是运算符,我们将字符串转换为整数,并将其压入栈中,这个操作的时间复杂度为 O(1)。
因此,整个函数的时间复杂度为 O(N)。

空间复杂度:
我们定义了一个栈 sta 来存储数字,其空间取决于输入字符串向量 tokens 的长度以及栈的大小。
在最坏的情况下,当输入字符串向量 tokens 中的所有元素都是数字时,栈的大小将等于字符串向量的长度。因此,栈 sta 的空间复杂度为 O(N)。
另外,我们还定义了一个变量 res 来存储最终的结果,其空间复杂度为 O(1)。
因此,函数的总体空间复杂度为 O(N)。

Code

class Solution {
public:
    typedef long long ll;
    int evalRPN(vector<string>& tokens) {
        stack<ll> sta;
        for(string ch:tokens){
            // 如果是运算符就弹出两个数
            if(ch=="+" || ch=="-" ||ch=="*" || ch=="/"){
                ll num1=sta.top();
                sta.pop();
                ll num2=sta.top();
                sta.pop();
                if(ch=="+") sta.push(num2+num1);
                if(ch=="-") sta.push(num2-num1);
                if(ch=="*") sta.push(num2*num1);
                if(ch=="/") sta.push(num2/num1);
            }
            //不是运算符的话就加入到栈中
            else sta.push(stoll(ch));
        }
        ll res=sta.top();
        sta.pop();
        return res;
    }
};
  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT民工小新

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

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

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

打赏作者

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

抵扣说明:

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

余额充值