洛谷P1449题解
洛谷P1449题解
题目信息:
题目链接:https://www.luogu.com.cn/problem/P1449
知识点:栈,字符串
题目简述:
输入后缀运算,给出结果
首先理解后缀运算,比如5+4-2+7(8-2),要把它变成没有括号的,运算符放在两个数之后,计算按运算符出现的顺序,左而右进行的运算,也就变成了5.4.+2.-8.2.-+@
相比于正常运算,输入的数的顺序不会改变,但是每个数后面有.作结束符,算数符号遇到就要进行运算。
题目分析:
例子:5+4-2+7(8-2) -> 5.4.+2.-8.2.-+@
由于括号的存在,先遇到的数不一定先算,如果要先算后面的数,前面的数遇到过要先存起来,这符合后进先出的原则
因此,用栈来储存数据,每次运算弹出栈顶两个数进行运算,把结果放到栈里即可,详见注释
代码
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
char s[60];
stack<int> stk;
int main() {
scanf("%s", s);
int len = strlen(s);
int n = 0;
for (int i = 0; i < len; i++) { //扫字符串
if (s[i] == '@')break;
if (s[i] >= '0' && s[i] <= '9'){ //如果是数字跳过,并用n存
n = (s[i] -'0')+10*n; //数字可能是多位
continue;
}
if (s[i] == '.') { //如果遇到.入栈
stk.push(n);
n=0;
}
else {
int a = stk.top(); stk.pop();
int b = stk.top(); stk.pop();
switch (s[i]) {
case '+':stk.push(a + b); break;
case '-':stk.push(b - a); break;
case '*':stk.push(a * b); break;
case '/':stk.push(b / a); break;
}
}
}
printf("%d\n", stk.top());
return 0;
}
最后


浙公网安备 33010602011771号