前文
看到这种表达式的题目,第一时间就想到了栈,
尤其是这种
关于后缀表达式的题目.
理论
用栈来模拟后缀表达式是非常便捷的.
对于后缀表达式,当遇到数字时,将数字压入栈中,如果是运算
符号,就将栈顶的两个元素弹出,根据符号进行运算,再把值放
回栈中.
代码
\(tips1:\)由于题目中的空格在求值时有点麻烦,可以先将空格删除,
再进行求值.
\(tips2:\)在进行运算时,尤其是减法时,应该用第二个取出来的元素
减去第一个,即栈顶元素.因为第二个元素是前面求完的值,而栈顶
元素是新加进来的.
\(tips3:\)取模时,注意保证结果为正数.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
stack<int> st; // 存数字
string s1, s;
int main() {
getline(cin, s1); // 原式
for (int i = 0; i < s1.size(); i++)
if (s1[i] != ' ') s += s1[i]; // 去空格
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9')
st.push((s[i] - '0') % 10); // 一位数字 取模
else { // 遇到符号
int num1 = st.top();st.pop(); // 先取栈顶的两位数字
int num2 = st.top();st.pop();
int res = 0;
switch (s[i]) { // 根据符号来决定值
case '+': res = num2 + num1;break;
case '-': res = num2 - num1;break;
case '*': res = num2 * num1;break;
}
// 取模时注意保证符号是正的
st.push((res + 10) % 10);
}
}
// 最终结果也要取模
printf("%d", st.top() % 10);
return 0;
}
标签:int,题解,s1,元素,后缀,波兰,include,表达式
From: https://www.cnblogs.com/panda-lyl/p/18577669