后缀表达式
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:
3*(5-2)+7
\texttt{3*(5-2)+7}
3*(5-2)+7 对应的后缀表达式为:
3.5.2.-*7.+@
\texttt{3.5.2.-*7.+@}
3.5.2.-*7.+@。在该式中,@
为表达式的结束符号。.
为操作数的结束符号。
输入格式
输入一行一个字符串 s s s,表示后缀表达式。
输出格式
输出一个整数,表示表达式的值。
样例 #1
样例输入 #1
3.5.2.-*7.+@
样例输出 #1
16
提示
数据保证, 1 ≤ ∣ s ∣ ≤ 50 1 \leq |s| \leq 50 1≤∣s∣≤50,答案和计算过程中的每一个值的绝对值不超过 1 0 9 10^9 109。
思路
用stl的栈存放操作数,用char数组存放s,依次向右扫描,如果是数字就压入栈,(注意两位以上的数字要进行字符拼接)是操作符op就依次弹出栈中的两个b,a,(a是左操作数,b是右操作数),将a op b的结果再压入栈中,遇到@就弹出栈顶元素
代码
#include<bits/stdc++.h>
using namespace std;
stack<int> num;
int main()
{
char s[51];
cin>>s;
int n=0;
int a,b;
int len=strlen(s);
for(int i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')
{
n=s[i]-'0';
while(s[i+1]>='0'&&s[i+1]<='9')
{
n=n*10+s[i+1]-'0';
i++;
}
num.push(n);
}
if(s[i]=='+')
{
b=num.top();
num.pop();
a=num.top();
num.pop();
num.push(a+b);
}
else if(s[i]=='-')
{
b=num.top();
num.pop();
a=num.top();
num.pop();
num.push(a-b);
}
else if(s[i]=='*')
{
b=num.top();
num.pop();
a=num.top();
num.pop();
num.push(a*b);
}
else if(s[i]=='/')
{
b=num.top();
num.pop();
a=num.top();
num.pop();
num.push(a/b);
}
else if(s[i]=='@')
cout<<num.top();
}
}