逆波兰表达式求值
题目
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 '+'、'-'、'*' 和 '/' 。每个操作数(运算对象)都可以是一个整数或者另一个表达式。两个整数之间的除法总是 向零截断 。表达式中不含除零运算。输入是一个根据逆波兰表示法表示的算术表达式。答案及所有中间计算结果可以用 32 位 整数表示。
题目链接
. - 力扣(LeetCode)
文字 和 画图 分析
这里我们主要是理解后缀如何转化成中缀
如 :后缀 2 1 + 3 *
中缀 (2 + 1) * 3
实际上是 先算 2 + 1 得到 3 ,再算 3 * 3
这里我们利用栈前进后出的思想
遇到数字就 push,遇到运算符就记录栈顶的两个元素,再进行运算
注意:
由于很可能出现负数的情况,不能只通过比较字符串的第一个首字符来判断是否是运算符还是数字 ,这里就直接比较两个字符串让字符串站化成整数,我们这里使用 函数stoi
代码
class Solution {public: int evalRPN(vector<string>& tokens) { stack<int> t; for(int i = 0;i < tokens.size();i++) { char tmp = tokens[i][0]; if(tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") { int right = t.top(); t.pop(); int left = t.top(); t.pop(); switch(tmp) { case '+': t.push(left + right); break; case '-': t.push(left - right); break; case '*': t.push(left * right); break; case '/': t.push(left / right); } } else { t.push(stoi(tokens[i])); } } return t.top(); }};