题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入输出格式
输入格式:
输入:后缀表达式
输出格式:
输出:表达式的值
输入输出样例
输入样例#1:
3.5.2.-*7.+@
输出样例#1:
16
说明
字符串长度,1000内。
此题其实不难,就是一个简单的栈的运用,有兴趣的也可以试试数组,不过较为贴切计算机的工作原理,我们通过代码(ac)来进行讲解
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>//不加此文件虽然在自己电脑可以通过编译,但是在洛谷云端中会编译错误
#include<stack>
using namespace std;
stack<long long int >s;//因为害怕数过大所以采用longlong
char h[3000];
int len=0;
int k[1000];
int ans=0;
int main()
{
cin>>h;
len=strlen(h);
int kx=0;
int now=0;
for(int i=0;i<len;i++)
{
if('0'<=h[i]&&h[i]<='9')
{
now*=10;//完成进位
now+=h[i]-'0';//
}
else if(h[i]=='.')
{
ans++;
s.push(now);//将数入栈
now=0;//重新初始化
}
//接下来的算法可以通过手动模拟后缀式计算得到
//显然,当我们遇到计算符号时,我们需要做的操作就是将最后进去的两个数进行运算
//然后我们将得到的结果覆盖这两个数
else if(h[i]=='-')
{
int kx=s.top();
s.pop();
s.top()-=kx;
}
else if(h[i]=='*')
{
int kx=s.top();
s.pop();
s.top()*=kx;
}
else if(h[i]=='+')
{
int kx=s.top();
s.pop();
s.top()+=kx;
}
else if(h[i]=='/')
{
int kx=s.top();
s.pop();
s.top()/=kx;
}
else if(h[i]=='@')
{
break;
}
}
cout<<s.top();//,因为我们每次计算后都将结果覆盖在了栈顶,最后直接输出栈顶就行了
while(1)
cout<<"Sabrina"<<endl;//防copy
return 0;
}