所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:\texttt{3*(5-2)+7}3*(5-2)+7 对应的后缀表达式为:\texttt{3.5.2.-*7.+@}3.5.2.-*7.+@。在该式中,@
为表达式的结束符号。.
为操作数的结束符号。
输入一行一个字符串 ss,表示后缀表达式。
输出一个整数,表示表达式的值。
输入 #1复制
3.5.2.-*7.+@
输出 #1复制
16
数据保证,1 \leq |s| \leq 501≤∣s∣≤50,答案和计算过程中的每一个值的绝对值不超过 10^9109。
- #include<bits/stdc++.h>
- using namespace std;
- #include<stdio.h>
- #include<stack>
- stack<int>n;//使用栈,后进先出模拟后缀表达式
- int main(){
- int s=0;//数
- char ch;
- while(1){
- scanf("%c",&ch);//每次只读入一个字符
- if(ch<='9'&&ch>='0') s=s*10+ch-'0';
- //应对读入多位数字的请况
- else if(ch=='.'){//读入数操作的结束
- n.push(s);
- s=0;
- }
- else if(ch!='@'){
- int a1=n.top();//取出两个元素进行运算操作
- n.pop();
- int a2=n.top();
- n.pop();
- if(ch=='+') n.push(a1+a2);
- if(ch=='-') n.push(a2-a1);//用栈顶第二个元素减栈顶元素
- if(ch=='*') n.push(a1*a2);
- if(ch=='/') n.push(a2/a1);
- }
- else break;
- }
- printf("%d",n.top());
- return 0;
- }
第二次做还是要看解析,加油