逆波兰表达式求值

23 45 2 * 8 2 + - +

  • 从左至右,遇到数值将数值依次压入栈中
  • 遇到符号弹出栈中两个元素,进行运算,再把结果压入栈中

1、23 45 2 压入栈中
2、弹出2、45,计算45*2=90,将90压入栈
3、依次把8、2 压入栈
4、弹出2、8计算8+2=10,将 10压栈
5、弹出10、90计算90-10=80,将80压入栈
6、弹出80、23计算23+80=103,将103压入栈
7、提取栈顶103,103为最后的结果

图片名称

C++代码实现

int evalRPN(vector<string>& tokens) {
   stack<int> sta;
   for (auto i : tokens)
   {
       if (i == "/" )
       {
           int sum1 = sta.top();    sta.pop();
           int sum2 = sta.top();   sta.pop();
           sta.push(sum2 / sum1);
       }
       else if (i == "*")
       {
           int sum1 = sta.top();    sta.pop();
           int sum2 = sta.top();   sta.pop();
           sta.push(sum2 * sum1);
       }
       else if (i == "+")
       {
           int sum1 = sta.top();    sta.pop();
           int sum2 = sta.top();   sta.pop();
           sta.push(sum2 + sum1);
       }
       else if (i == "-")
       {
           int sum1 = sta.top();    sta.pop();
           int sum2 = sta.top();   sta.pop();
           sta.push(sum2 - sum1);
       }
       else
       {
           int num = std::stoi(i);
           sta.push(num);
       }
   }
   return sta.top();
}
int main()
{
   vector<string> vec0{ "2", "1", "+", "3", "*" };
   vector<string> vec1{ "4", "13", "5", "/", "+" };
   vector<string> vec2{ "10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+" };
   cout << evalRPN(vec0) << endl;
   cout << evalRPN(vec1) << endl;
   cout << evalRPN(vec2) << endl;
   return 0;
}

相关例题:Leetcode
逆波兰表达式求值
测试用例

输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
输出: 22