【C/C++】后缀表达式蓝桥杯/ACM备赛
- 人工智能
- 2025-09-05 20:57:02

核心考点: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 后缀表达式 - 洛谷
【C/C++】后缀表达式蓝桥杯/ACM备赛由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【C/C++】后缀表达式蓝桥杯/ACM备赛”
下一篇
计网week5