题目
逆波兰表达式求值
逆波兰表达式就是后缀表达式,我们平时写的带括号的是中缀表达式。区分中缀表达式和后缀表达式 就是 操作数 和 操作符 的先后关系。 操作符在后 就是后缀表达式
- 后缀表达式 的用途就是 让计算机直到计算的先后顺序!
比如 我们中缀表达式 a * (b - c) 以我们人类的智慧一眼就知道先算后面的括号,是跳跃式的。但是计算机是从左到右扫描整个表达式。所以我们就需要把这个表达式改为其他形式。 - a* (b - c)改成后缀表达式就是 a bc - * 后面的操作符 是根据优先级排的,()的优先级最高
- 再来个例子 a + b * c - d 改成后缀表达式就是 a bc*+d-
算法原理
- 先定义一个stack ,遍历数组,遇到数字就入栈
- 遇到操作符就出栈,先出的为右操作数,后出的为左操作数,然后计算的结果再入栈。
- 最后返回栈顶元素就ok了
代码实现
int evalRPN(vector<string>& tokens) {
set<string> s = { "+","-","*","/" };
stack<int> st;
for (auto& str : tokens) {
if (s.find(str) != s.end()) {
int right = st.top();
st.pop();
int left = st.top();
st.pop();
switch (str[0]) {
case '+':
st.push(left + right);
break;
case '-':
st.push(left - right);
break;
case '*':
st.push(left * right);
break;
case '/':
st.push(left / right);
break;
}
}
else {
st.push(stoi(str));
}
}
return st.top();
}
可能有同学好奇字符怎么转整型的文章来源:https://www.toymoban.com/news/detail-847693.html
补充 stoi的实现
stoi的实现文章来源地址https://www.toymoban.com/news/detail-847693.html
class Solution {
public:
int myAtoi(string str) {
int i = 0;
while(str[i] == ' '){
i++;
}
int flag = 1;
switch (str[i]){
case '-':
flag = -1;
i++;
break;
case '+':
flag = 1;
i++;
break;
}
//i++;
long long ret = 0;
for(; i < str.size(); i++){
if(str[i]>'9' || str[i]<'0'){
break;
}
ret = 10* ret + (str[i] -'0') ;
if(ret > INT_MAX){
break;
}
}
ret *= flag;
if(ret > INT_MAX){
ret = INT_MAX ;
}
if(ret < INT_MIN){
ret = INT_MIN;
}
return ret ;
}
};
到了这里,关于栈|逆波兰表达式求值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!