后缀表达式
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如: 对应的后缀表达式为:。在该式中,@
为表达式的结束符号。.
为操作数的结束符号。
输入格式
输入一行一个字符串 ,表示后缀表达式。
输出格式
输出一个整数,表示表达式的值。
样例 #1
样例输入 #1
3.5.2.-*7.+@
样例输出 #1
16
提示
数据保证,,答案和计算过程中的每一个值的绝对值不超过 。
思路
从输入中逐个读入字符,对于每个字符进行如下处理:
- 如果是 +、-、*、/ 中的一个,则从栈中弹出两个数 a 和 b,将其进行相应的运算后将结果 c 压入栈中。
- 如果是数字,则将其转化为整数 x,用一个变量存储。
- 如果是 .,说明当前数字已经读取完毕,将其压入栈中,并将 x 清零。
- 如果是 @,说明输入结束,跳出循环。
最后,输出栈顶元素即可得到结果。
AC代码
#include <iostream>
#include <stack>
#define AUTHOR "HEX9CF"
using namespace std;
char ch;
stack<int> stk;
void getNum(int &a, int &b)
{
b = stk.top();
stk.pop();
a = stk.top();
stk.pop();
};
int main()
{
int x = 0;
while (~(ch = getchar()))
{
int a, b, c;
if ('@' == ch)
{
break;
}
switch (ch)
{
case '+':
getNum(a, b);
c = a + b;
stk.push(c);
// cout << a << " + " << b << " = " << c << endl;
break;
case '-':
getNum(a, b);
c = a - b;
stk.push(c);
// cout << a << " - " << b << " = " << c << endl;
break;
case '*':
getNum(a, b);
c = a * b;
stk.push(c);
// cout << a << " * " << b << " = " << c << endl;
break;
case '/':
int a, b, c;
getNum(a, b);
c = a / b;
stk.push(c);
// cout << a << " / " << b << " = " << c << endl;
break;
case '.':
stk.push(x);
x = 0;
break;
default:
x = x * 10 + ch - '0';
}
}
cout << stk.top() << endl;
return 0;
}
标签:ch,洛谷,int,题解,样例,stk,后缀,P1449,表达式
From: https://blog.51cto.com/HEX9CF/11930733