本题地址: http://www.luogu.org/problem/show?pid=1449
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
输入输出格式
输入格式:
输入:后缀表达式
输出格式:
输出:表达式的值
输入输出样例
输入样例#1:
3.5.2.-*7.+@
输出样例#1:
16
说明
字符串长度,1000内。
解题思路:
用栈模拟后缀表达式即可
即先读入两个数,再计算
按顺序即可
注意:
1谁说数只有一位?
2里面会有’.’,’。’这类无用的符号
#include<iostream>
#include<stack>
//STL STACK 好用,虽然速度慢了点
using namespace std;
stack<int> a;
int main()
{
cin.sync.with_stdio(false);//理论可加快读入时间,但用洛谷测时间还长些···
int top,top1;
char c;
while(1)
{
cin>>c;//先读入,后加减的后缀表达式思想
if(c=='@')
break;
if(c>='0'&&c<='9')
{
a.push((c-'0'));
while(1)//这里处理不止一位的情况
{
cin>>c;
if(!(c>='0'&&c<='9'))
break;
top=a.top();
a.pop();
a.push(top*10+c-'0');
}
}
if(c=='+')//加减乘除处理
{
top=a.top();
a.pop();
top1=a.top();
a.pop();
a.push(top+top1);
}
else
if(c=='-')
{
top=a.top();
a.pop();
top1=a.top();
a.pop();
a.push(top1-top);
}
else
if(c=='*')
{
top=a.top();
a.pop();
top1=a.top();
a.pop();
a.push(top*top1);
}
else
if(c=='/')
{
top=a.top();
a.pop();
top1=a.top();
a.pop();
a.push(top1/top);
}
}
cout<<a.top();
return 0;
}