用逆波兰表达式计算一个算术表达式的值。
有效的运算符仅为+、-、*和/。每个操作数可以是一个整数或另一个表达式。
注意:两个整数之间的除法应该取整。保证给定的 RPN 表达式总是有效的。这意味着该表达式总是会计算出一个结果,并且不会有任何除零操作。
示例 1:
输入: tokens = ["2","1","+","3","*"] 输出: 9 表达式: ((2 + 1) * 3) = 9
示例 2:
输入: tokens = ["4","13","5","/","+"] 输出: 6 表达式: (4 + (13 / 5)) = 6
示例 3:
输入: tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"] 输出:22 表达式: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
思路:
这是一道中等难度的题目。思路是遍历vector<int>的期间,遇到一个运算符就计算,遇到数字就入栈。把每一步的计算结果塞进一个stack<int>的临时栈中保存, 每次都取栈顶的两个数出来计算, 算好之后再把临时结果压入栈顶,全部计算完成之后——即完成原vector<int> tokens的遍历——再用stack<int>的top()函数直接返回计算结果。
AC代码:
class Solution { public: int evalRPN(vector<string>& tokens) { std::stack<int> tempStack; for (std::vector<string>::iterator it = tokens.begin() ; it != tokens.end(); ++it) { if((*it) == "+") { int op2 = tempStack.top(); tempStack.pop(); int op1 = tempStack.top(); tempStack.pop(); tempStack.push(op1+op2); } else if((*it) == "-") { int op2 = tempStack.top(); tempStack.pop(); int op1 = tempStack.top(); tempStack.pop(); tempStack.push(op1-op2); } else if((*it) == "*") { int op2 = tempStack.top(); tempStack.pop(); int op1 = tempStack.top(); tempStack.pop(); tempStack.push(op1*op2); } else if((*it) == "/") { int op2 = tempStack.top(); tempStack.pop(); int op1 = tempStack.top(); tempStack.pop(); tempStack.push(op1 / op2); } else { tempStack.push(std::stoi(*it)); } } return tempStack.top(); } };
Published by