题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:
3*(5-2)+7
\texttt{3*(5-2)+7}
3*(5-2)+7 对应的后缀表达式为:
3.5.2.-*7.+@
\texttt{3.5.2.-*7.+@}
3.5.2.-*7.+@。在该式中,@
为表达式的结束符号。.
为操作数的结束符号。
输入格式
输入一行一个字符串 s s s,表示后缀表达式。
输出格式
输出一个整数,表示表达式的值。
样例 #1
样例输入 #1
3.5.2.-*7.+@
样例输出 #1
16
提示
数据保证, 1 ≤ ∣ s ∣ ≤ 50 1 \leq |s| \leq 50 1≤∣s∣≤50,答案和计算过程中的每一个值的绝对值不超过 1 0 9 10^9 109。
解题思路:
该题的考点就是STL中的stack
这里首先通过样例讲解本题题意:首先进行5-2的操作,将结果与3进行运算
再进行3*3的操作,将结果与7运算
最后进行9+7的操作,得到结果16
采用IPO实现代码:
(1)I:
直接以字符串形式读入
(2)P:
创建一个堆栈
stack<int> num_stack;
从头开始遍历字符串
若为数字,则入栈
if ('0' <= str[i] && str[i] <= '9')//获取操作数
{
int left = i, right = i + 1;
while ('0' <= str[right] && str[right] <= '9')
{
right++;
}
num_stack.push(stoi(str.substr(left, right)));//将操作数截取、转换、插入
i = right;//更新i的位置
}
若为运算符,则出栈两个操作数运算
(注:先出栈的操作数为num_2,后出栈的操作数为num_1)
然后将运算结果作为操作数入栈
else if(str[i] != '.')//获取运算符
{
//获取到运算符,则进行操作
int num_2 = num_stack.top();//先获取的操作数为num_2
num_stack.pop();
int num_1 = num_stack.top();//后获取的操作数为num_1
num_stack.pop();
switch (str[i])
{
case '+':
num_1 += num_2;
break;
case '-':
num_1 -= num_2;
break;
case '*':
num_1 *= num_2;
break;
case '/':
num_1 /= num_2;
break;
case '%':
num_1 %= num_2;
break;
default:
break;
}
num_stack.push(num_1);//将运算结果作为操作数入栈
i++;
}
(3)O:
最后,堆栈中剩余的唯一一个元素即为结果
完整的代码如下
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main()
{
string str;
stack<int> num_stack;//存储操作数
int num_1, num_2;//用于获取运算的两个操作数
cin >> str;
int i = 0;
while (str[i] != '@')//获取运算数和操作符
{
if ('0' <= str[i] && str[i] <= '9')//获取操作数
{
int left = i, right = i + 1;
while ('0' <= str[right] && str[right] <= '9')
{
right++;
}
num_stack.push(stoi(str.substr(left, right)));//将操作数截取、转换、插入
i = right;//更新i的位置
}
else if(str[i] != '.')//获取运算符
{
//获取到运算符,则进行操作
int num_2 = num_stack.top();
num_stack.pop();
int num_1 = num_stack.top();
num_stack.pop();
switch (str[i])
{
case '+':
num_1 += num_2;
break;
case '-':
num_1 -= num_2;
break;
case '*':
num_1 *= num_2;
break;
case '/':
num_1 /= num_2;
break;
case '%':
num_1 %= num_2;
break;
default:
break;
}
num_stack.push(num_1);
i++;
}
else//是'.',跳过
{
i++;
}
}
cout << num_stack.top() << endl;
return 0;
}