P1449 后缀表达式(洛谷题面

题目

题目描述:

所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。

本题中运算符仅包含 +-*/\texttt{+-*/}。保证对于 /\texttt{/} 运算除数不为 0。特别地,其中 /\texttt{/} 运算的结果需要向 0 取整(即与 C++ / 运算的规则一致)。

如:3*(5-2)+7\texttt{3*(5-2)+7} 对应的后缀表达式为:3.5.2.-*7.+@\texttt{3.5.2.-*7.+@}。在该式中,@ 为表达式的结束符号。. 为操作数的结束符号。

输入格式:

输入一行一个字符串 ss,表示后缀表达式。

输出格式:

输出一个整数,表示表达式的值。

数据范围与说明:

数据保证,1s501 \leq |s| \leq 50,答案和计算过程中的每一个值的绝对值不超过 10910^9

输入输出样例 #1

输入:

1
3.5.2.-*7.+@

输出:

1
16

输入输出样例 #2

输入:

1
10.28.30./*7.-@

输出:

1
-7

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<bits/stdc++.h>
using namespace std;
stack<int> num;
char s[10001];
char ccty[21];
int flag = 0, i = 0;
int numa, numb, Num;
int k = 0;
int makernum(){
int ret=0;
for(int i=0;i<=strlen(ccty)-1;++i){
if(ccty[i]=='*')break;
ret=ret*10+ccty[i]-'0';
ccty[i]='*';
}
return ret;
}
int main() {
cin >> s;
char cha = s[0];
while (cha != '@') {
if (flag == 0) i = 0;
if (cha >= '0' && cha <= '9') {
flag = 1;
ccty[i] = cha;
i++;
}
if (cha == '.') {
flag = 0;
Num = makernum();
num.push(Num);
}
if ((cha < '0' || cha > '9') && cha != '.') {
numa = num.top(); num.pop();
numb = num.top(); num.pop();
if (cha == '+') num.push(numb + numa);
if (cha == '-') num.push(numb - numa);
if (cha == '*') num.push(numb * numa);
if (cha == '/') num.push(numb / numa);
}
k++;
cha = s[k];
}
cout << num.top() << endl;
return 0;
}