[luogu p1449] 后缀表达式
后缀表达式
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。'@'为表达式的结束符号。'.'为操作数的结束符号。
输入输出格式
输入格式
输入:后缀表达式
输出格式
输出:表达式的值
输入输出样例
输入样例 #1
3.5.2.-*7.+@
输出样例 #1
16
说明
字符串长度,1000内。
分析
一道裸stack
,读入数直接把数入stack
,读入运算符直接把stack
顶端的两个数进行相应的运算得到一个数,把原来的两个数pop
掉,再把新数push
进去就好了。
思维难度倒是挺简单的,但是因为我很菜,有一个小bug
调了很久。
代码
/*
* @Author: crab-in-the-northeast
* @Date: 2020-03-07 12:31:18
* @Last Modified by: crab-in-the-northeast
* @Last Modified time: 2020-03-08 15:53:05
*/
#include <iostream>
#include <cstdio>
#include <stack>
const int maxn = 1005;
int s[maxn];
int top;
long long num;
int main() {
char ch;
ch = getchar();
while(ch != '@') {
if(ch >= '0' && ch <= '9') num = num * 10 + ch - '0';
if(ch == '.') {
s[++top] = num;
num = 0;
}
switch(ch) {
case '+': s[top - 1] += s[top];break;
case '-': s[top - 1] -= s[top];break;
case '*': s[top - 1] *= s[top];break;
case '/': s[top - 1] /= s[top];break;
}
if(ch == '+' || ch == '-' || ch == '*' || ch == '/')
top--;
ch = getchar();
}
printf("%d\n",s[1]);
return 0;
}
评测结果
AC 100
: R31474274