核心考点:1.栈的应用 2.字符串处理
题目描述
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
本题中运算符仅包含 +-*/+-*/。保证对于 // 运算除数不为 0。特别地,其中 // 运算的结果需要向 0 取整(即与 C++ /
运算的规则一致)。
如:3*(5-2)+73*(5-2)+7 对应的后缀表达式为:3.5.2.-*7.+@3.5.2.-*7.+@。在该式中,@
为表达式的结束符号。.
为操作数的结束符号。
输入格式
输入一行一个字符串 ss,表示后缀表达式。
输出格式
输出一个整数,表示表达式的值。
输入输出样例
输入 #1
3.5.2.-*7.+@
输出 #1
16
输入 #2
10.28.30./*7.-@
输出 #2
-7
详细解答:
#include <iostream>
#include <stack>
#include <sstream>
using namespace std;
int main()
{
stringstream streamer; // 用于存储当前读取的数字
string str; // 存储输入的后缀表达式
getline(cin, str, '@'); // 读取输入的后缀表达式,遇到 '@' 时结束输入
stack<int> sta; // 用栈来存储操作数
// 遍历后缀表达式中的每个字符
for (auto &c : str)
{
if (c == '.') // 处理操作数结束符 '.'
{
int val;
streamer >> val; // 读取当前数字
sta.push(val); // 将操作数压入栈
streamer.clear(); // 清空字符串流,为下一次读取做准备
}
else if (isdigit(c)) // 如果是数字字符,加入到字符串流中
streamer << c;
else // 如果是运算符
{
int a, b;
a = sta.top(); // 弹出栈顶的第一个操作数
sta.pop();
b = sta.top(); // 弹出栈顶的第二个操作数
sta.pop();
// 根据不同的运算符进行相应的运算
switch (c)
{
case '+': // 加法
sta.push(a + b);
break;
case '-': // 减法
sta.push(b - a);
break;
case '*': // 乘法
sta.push(a * b);
break;
case '/': // 除法
sta.push(b / a); // 向0取整的除法(C++中的整数除法)
break;
}
}
}
printf("%d", sta.top()); // 输出栈顶的值,即表达式的计算结果
return 0;
}
核心知识积累:
1.通过stringstreamer字符串流将字符型和整型进行转换
stringstreamer streamer;
streamer<<c;
steamer>>val;
2.循环语句的写法:for(auto &c:str)
这句话的意思是:定义一个变量c,从str中逐一取元素,c的类型根据str决定,所以前面是auto
3.getline()函数
getline(cin,str,'@');若有三个参数,意思是遇见@停止输入;
getline(cin,str);若只有两个参数,则意思是遇见回车停止输入。
题目解析
1. 思路分析
本题是关于后缀表达式的求值问题。后缀表达式的特点是:没有括号,运算符出现在操作数之后。解决此类问题的常见方法是使用栈来存储操作数。对于每个符号的处理可以分为以下几步:
- 遇到数字:将数字压入栈中。
- 遇到运算符:弹出栈顶的两个操作数,进行相应的运算,然后将运算结果重新压入栈中。
- 最后,栈顶的值即为整个表达式的结果。
2. 栈的使用
栈是本题的核心数据结构。后缀表达式中,运算符总是出现在两个操作数之后,意味着在运算符出现时,操作数已经在栈中准备好。因此,栈可以方便地管理这些操作数并执行运算。
- 当遇到数字时,我们将其压入栈。
- 当遇到运算符时,我们从栈中弹出两个操作数,执行运算,然后将结果再压入栈中。
3. 运算符处理
在本题中,支持的运算符有+
、-
、*
、/
,其中 /
运算符要求向0取整,这与大多数编程语言的向下取整规则不同。C++中的整型除法会自动执行向0取整(即除法结果的小数部分被截断)。
4. 输入输出格式
- 输入:一个字符串表示后缀表达式,表达式中的数字和运算符通过
.
与@
符号进行分隔,@
表示表达式的结束。 - 输出:一个整数,表示后缀表达式的计算结果。
5.易错点:push中b-a还是a-b要注意,以及除法
题目来源:P1449 后缀表达式 - 洛谷