从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。以@作为结束标志。
比如,16–9*(4+3)转换成后缀表达式为:16□9□4□3□+*–,在字符数组A中的形式为:
栈中的变化情况:
运行结果:-47
提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在2^64范围内,如有除法保证能整除。
输入
一个后缀表达式。
输出
一个后缀表达式的值。
样例输入1
16 9 4 3 +*-@
样例输出1
-47
提示/说明
数字可能为负数
标签
普及 其他 栈
#include<iostream>
#include<stack>
#include<string>
using namespace std;
stack <long long> s;
int main()
{
string a;
long long t=-1,m,n,ans,i=0;//2^64
getline(cin,a);//空格
while (a[i]!=64)//ASCII码表第六十四个是@,程序的结束
{
if (a[i]>=48&& a[i]<=57)//ASCII码表第四十八个到五十七个是 0~9,是数字
{
if (t==-1)
{
t=a[i]-48;
s.push(t);
}
else
{
t = s.top();
s.pop();
t = t * 10 + (a[i] - '0');
s.push(t);
}
}
if (a[i]==32) t = -1;//是空格,前面的字符是一个数
if (a[i]==43)//是加号
{
m=s.top();//栈顶是m
s.pop();//弹出栈顶
n=s.top();//次栈顶是n
s.pop();//弹出次栈顶
ans = m + n;//m,n为要运算的数
s.push(ans);//压入运算结果
}
if (a[i]==45)//是减号
{
m = s.top();
s.pop();
n = s.top();
s.pop();
ans = n-m;
s.push(ans);
//同上
}
if (a[i]==42)//是乘号
{
m = s.top();
s.pop();
n = s.top();
s.pop();
ans = n*m;
s.push(ans);
//同上
}
if (a[i]==47)//是除号
{
m = s.top();
s.pop();
n = s.top();
s.pop();
ans = n/m;//次栈顶/栈顶
s.push(ans);
//同上
}
i++;
}
cout<<s.top();//栈里最后一个
return 0;
}