Evaluate Reverse Polish Notation

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are +, -, *, /. Each operand may be an integer or another expression.

Note:

  • Division between two integers should truncate toward zero.
  • The given RPN expression is always valid. That means the expression would always evaluate to a result and there won’t be any divide by zero operation.

Example 1:
Input: [“2”, “1”, “+”, “3”, “*”]
Output: 9
Explanation: ((2 + 1) * 3) = 9

Example 2:
Input: [“4”, “13”, “5”, “/”, “+”]
Output: 6
Explanation: (4 + (13 / 5)) = 6

Example 3:
Input: [“10”, “6”, “9”, “3”, “+”, “-11”, “", “/”, "”, “17”, “+”, “5”, “+”]
Output: 22
Explanation:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

在反向波兰表示法中计算算术表达式的值。

有效的运算符是+, - ,*,/。 每个操作数可以是整数或另一个表达式。

注意:

  • 两个整数之间的划分应截断为零。
  • 给定的RPN表达式始终有效。 这意味着表达式总是会计算结果,并且不会有任何除零操作。

2,题目思路

对于这道题,要求对一个后缀表达式进行解析并求出最后的结果。

后缀表达式非常简单,而且也是栈的运用的一个最经典的例子,这里也不需要赘述了。

唯一一点要说的,就是stoi可以直接将字符串数字转换为int型,而不一定非要是char类型。

3,代码实现

static auto speedup = [](){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        int a,b;
        for(auto &t : tokens){
            if(op.count(t)!=0){
                if(t == "+"){
                    a = st.top();st.pop();
                    b = st.top();st.pop();
                    st.push(b+a);
                    continue;
                }
                else if(t == "-"){
                    a = st.top();st.pop();
                    b = st.top();st.pop();
                    st.push(b-a);
                    continue;
                }
                else if(t == "*"){
                    a = st.top();st.pop();
                    b = st.top();st.pop();
                    st.push(b*a);
                    continue;
                }
                else if(t == "/"){
                    a = st.top();st.pop();
                    b = st.top();st.pop();
                    st.push(b/a);
                    continue;
                }
            }
            else
                st.push(stoi(t));
        }
        return st.top();  
    }
private:
    set<string> op = {"+", "-", "*", "/"};
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值