题目
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
- 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
测试样例1:
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
测试样例2:
输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
解题思路
**思路:**遇到数字就进行入栈,遇到符号就取弹出两个元素再操作后再次将计算结果压如栈中,栈中最后就会只剩下一个最终的结果,取栈顶元素也就是所要求的结果了。
注意:
1、由于stl的st.pop()没有返回值,所以可以执行先取栈顶元素后再删除
2、逆波兰后缀表达式从栈顶弹出元素时,先弹出来的作为被减数,也就是右面的数,后弹出来的是前面的数,例如num1是先弹出来的,num3是后弹出来的,则 num2 操作数 num1,前缀表达式相反。
3、题目要求 1 <= tokens.length <= 104,故而 使用long long类型文章来源:https://www.toymoban.com/news/detail-641353.html
stoll 此函数将在函数调用中作为参数提供的字符串转换为long long int。它解析str并将其内容解释为指定基数的整数,并将其作为long long int类型的值返回文章来源地址https://www.toymoban.com/news/detail-641353.html
//
//@i want to 舞动乾坤 2023/08/10
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<long long> st;
for(int i=0;i<tokens.size();i++){
//如果为操作符号
if(tokens[i]=="+" || tokens[i]=="-" || tokens[i]=="*" || tokens[i]=="/"){
long long opera_num1=st.top();//取栈顶第一个操作数
st.pop();//删除元素
long long opera_num2=st.top();//取第二个操作数
st.pop();//删除第二个元素,无返回值
if(tokens[i]=="+") //如果是加号
st.push(opera_num2+opera_num1);//将操作数计算的结果压入栈中
if(tokens[i]=="-") //
st.push(opera_num2-opera_num1);
if(tokens[i]=="*") //
st.push(opera_num2*opera_num1);
if(tokens[i]=="/") //
st.push(opera_num2/opera_num1);
}else{//如果是数字,就进行入栈
st.push(stoll(tokens[i]));
}
}
return st.top();//遍历完成后栈中只剩最终的一个结果,取栈顶元素即可。
}
};
到了这里,关于【代码随想录-Leetcode第四题:150. 逆波兰表达式求值】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!