当前位置: 首页 > news >正文

题解:AcWing 3302 表达式求值

【题目来源】

AcWing:3302. 表达式求值 - AcWing题库

【题目描述】

给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。

【输入】

共一行,为给定表达式。

【输出】

共一行,为表达式的结果。

【输入样例】

(2+2)*(1+1)

【输出样例】

8

【解题思路】

6c018de0a48e5261ccad6ea15ecffd08

【算法标签】

《AcWing 3302 表达式求值》 #栈# #表达式求值#

【代码详解】

#include <bits/stdc++.h>
using namespace std;// 定义两个栈:操作数栈和运算符栈
stack<int> num;  // 存储操作数的栈(整数类型)
stack<char> op;  // 存储运算符的栈(字符类型)/*** 执行栈顶运算:从栈中弹出两个操作数和一个运算符,计算结果后压回栈中* 注意:先弹出的是第二个操作数,后弹出的是第一个操作数*/
void eval()
{// 从操作数栈中弹出第二个操作数(栈顶元素)auto b = num.top(); num.pop();// 从操作数栈中弹出第一个操作数auto a = num.top(); num.pop();// 从运算符栈中弹出运算符auto c = op.top(); op.pop();int x;  // 存储运算结果// 根据运算符执行相应的算术运算if (c == '+') {x = a + b;  // 加法运算}else if (c == '-') {x = a - b;  // 减法运算}else if (c == '*') {x = a * b;  // 乘法运算}else {x = a / b;  // 除法运算(整数除法)}// 将计算结果压回操作数栈num.push(x);
}int main()
{// 定义运算符优先级映射表// 优先级数值越大,优先级越高unordered_map<char, int> pr = {{'+', 1},  // 加法优先级为1{'-', 1},  // 减法优先级为1  {'*', 2},  // 乘法优先级为2{'/', 2}   // 除法优先级为2};string str;  // 存储输入的中缀表达式字符串cin >> str;  // 读取表达式// 遍历表达式中的每个字符for (int i = 0; i < str.size(); i++) {auto c = str[i];  // 当前字符// 处理数字字符if (isdigit(c)) {int x = 0;    // 当前数字的值int j = i;    // 用于扫描连续数字的指针// 提取连续的数字字符,处理多位数while (j < str.size() && isdigit(str[j])){// 将字符转换为数字并累加x = x * 10 + (str[j] - '0');j++;}i = j - 1;    // 更新主循环索引,跳过已处理的数字num.push(x);  // 将数字压入操作数栈} // 处理左括号:直接压入运算符栈else if (c == '(') {op.push(c);}// 处理右括号:计算括号内的所有表达式else if (c == ')') {// 不断计算直到遇到左括号while (op.top() != '(') {eval();  // 执行计算}op.pop();  // 弹出左括号}// 处理运算符:+ - * /else {// 当栈不为空,且栈顶不是左括号,且栈顶运算符优先级不低于当前运算符时while (op.size() > 0 && op.top() != '(' && pr[op.top()] >= pr[c]) {eval();  // 先计算优先级高的运算}op.push(c);  // 当前运算符压栈}}// 处理运算符栈中剩余的所有运算while (op.size() > 0) {eval();}// 输出最终结果(操作数栈中唯一的元素)cout << num.top() << endl;return 0;
}

【运行结果】

(2+2)*(1+1)
8
http://www.jsqmd.com/news/399268/

相关文章:

  • CST仿真:探索涡旋与聚焦的奇妙世界
  • 678678678
  • SaaS架构下AI原生应用的最佳实践与案例分析
  • 题解:P15369 『ICerOI Round 1』并非图论
  • 题解:AcWing 828 模拟栈
  • 深度解析AI原生应用领域的事件驱动机制
  • 大数据ETL处理:GPU加速方案设计与性能优化
  • C语言中的数据类型和变量
  • 题解:AcWing 827 双链表
  • 题解:AcWing 826 单链表
  • 题解:AcWing 802 区间和
  • js获取html相邻标签
  • 题解:AcWing 803 区间合并
  • 计算机毕业设计 | SpringBoot+vue科研项目验收管理系统(附源码+论文)
  • 计算机毕业设计 | SpringBoot+vue毕业论文管理系统 高校文档项目答辩平台(附源码+论文)
  • 计算机毕业设计 | SpringBoot+vue中山社区医疗综合服务平台(附源码+论文)
  • Flink 任务失败恢复机制Restart Strategy 和 Failover Strategy 怎么配才“又稳又不炸”
  • Tauri 前端配置把任何前端框架“正确地”接进 Tauri(含 Vite/Next/Nuxt/Qwik/SvelteKit/Leptos/Trunk)
  • 计算机毕业设计 | SpringBoot+vue毕业设计答辩平台 校园成绩管理系统(附源码+论文)
  • Tauri 项目结构前端壳 + Rust 内核,怎么协作、怎么构建、怎么扩展
  • 抖音评论自动采集|拓客|免登录
  • 当Claude Code负责人说amp;quot;编程已解决amp;quot;,测试工程师该慌吗?
  • Claude Code 安装教程(macOS / Linux / Windows PowerShell 一键脚本)【2026 最新】
  • 题解:AcWing 801 二进制中1的个数
  • 寒假第二十天
  • 一文彻底搞懂强化学习
  • js XMLHttpRequest编程误区(复用这个对象导致的冲突问题)
  • 当Claude Code负责人说编程已解决,测试工程师该慌吗?
  • vue+springboot线上学生作业批改考试系统_6li288nu
  • pythonQT图书管理系统的进阶版本