一、题意
二、思考过程
逆波兰表达式就是 一种后缀表达式。所谓后缀就是指运算符写在后面。
逆波兰表达式主要有以下两个优点:
- 去掉括号后表达式无歧义。
- 适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行运算,并将结果压入栈中。
其实逆波兰表达式相当于是二叉树中的后序遍历。
进一步看,这道题就是一个相邻字符串消除(运算)的过程。
class Solution { public: int evalRPN(vector<string>& tokens) { stack<int> st; for (int i = 0; i < tokens.size(); i++) { if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") { int num1 = st.top(); st.pop(); int num2 = st.top(); st.pop(); if (tokens[i] == "+") st.push(num2 + num1); if (tokens[i] == "-") st.push(num2 - num1); if (tokens[i] == "*") st.push(num2 * num1); if (tokens[i] == "/") st.push(num2 / num1); } else { st.push(stoi(tokens[i])); } } int result = st.top(); st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事) return result; } };