说明
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入格式
输入:后缀表达式
输出格式
输出:表达式的值
样例
输入数据 1
3.5.2.-*7.+@
Copy
输出数据 1
16
Copy
题目思路:
这道题可以用栈来解决。在字符串里找到数字就存进栈,这里需要注意,只要没有出现“.”就要一直存,把当前位扩大十倍后加上后出现的数并转化成整型。再根据出现的符号把栈的前两位弹出进行计算。随后再把结果存回栈,最后栈里的数就是结果:
代码如下:
#include <bits/stdc++.h>
using namespace std;
stack <int> s;
int main()
{
string s1;
cin >>s1;
int a,b,c=0,ans=0;
for(int i=0;i<s1.size();i++)
{
if(s1[i]>='0'&&s1[i]<='9')
{
c=c*10+(s1[i]-'0');
}
else if(s1[i]=='.')
{
s.push(c);
c=0;
}
else if(s1[i]=='+')
{
a=s.top();
s.pop();
b=s.top();
s.pop();
ans=a+b;
s.push(ans);
}
else if(s1[i]=='-')
{
a=s.top();
s.pop();
b=s.top();
s.pop();
ans=b-a;
s.push(ans);
}
else if(s1[i]=='*')
{
a=s.top();
s.pop();
b=s.top();
s.pop();
ans=a*b;
s.push(ans);
}
else if(s1[i]=='/')
{
a=s.top();
s.pop();
b=s.top();
s.pop();
ans=b/a;
s.push(ans);
}
else if(s1[i]=='%')
{
a=s.top();
s.pop();
b=s.top();
s.pop();
ans=a%b;
s.push(ans);
}
}
cout <<ans;
return 0;
}
byebye!