c++实现逆波兰表达式求值

逆波兰表达式求值

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation

根据 逆波兰表示法,求表达式的值。

有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例:

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
+
4
/
13
5

我们习惯的(4 + (13 / 5))的顺序是上图中序遍历的结果,而逆波兰式[“4”,“13”,“5”,"/","+"]是后序遍历的结果,好处是运算符只与之前的两个数字有关,而不必考虑运算符的优先级。
即“/”只与13和5有关,而“+”只与4和(13/5)有关。
因此我们只需要用一个栈来存储数字,每遇到一个数字就压栈,每遇到运算符就让栈顶的两个数字出栈,并将计算结果压入栈中,最后栈里就只剩下一个元素,也就是逆波兰式的最终结果。
C++代码如下:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        vector<int> num;   //vector也可以实现栈的功能
        int temp1, temp2;  //临时存放栈顶的两个元素
        for(int i = 0;i < tokens.size();i++)
        {
            if(isdigit(tokens[i][0])|| isdigit(tokens[i][1]))  //做两次判断是为了避免将负数判断成运算符
            {
                num.push_back(stoi(tokens[i]));
            }
            else{
                temp2 = num[num.size() - 1];
                num.pop_back();
                temp1 = num[num.size() - 1];
                num.pop_back();
                switch(tokens[i][0]){
                    case '+':num.push_back(temp1 + temp2);break;
                    case '-':num.push_back(temp1 - temp2);break;
                    case '/':num.push_back(temp1 / temp2);break;
                    case '*':num.push_back(temp1 * temp2);break;
                }
            }
        }
        return num[0];
    }
};

有任何问题都可以在评论区和我交流~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值