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

双栈实现方法实例分析

双栈实现基于上文对后缀表达式的操作与解释。现在正式展示具体的代码实现。首先最重要的我们需要两个和栈数值栈和运算符栈。在遍历时需要同时对后缀表达式的生成方式和计算方式这两方面同步进行。核心就是在每次运算符栈的弹栈操作均伴随着一次数值的计算共三处遍历到运算符遍历到右括号遍历完处理非空的运算符栈根据运算符的种类对数值栈的栈顶元素和栈顶倒数第二个元素进行运算并将计算结果再次保存到数值栈中。预处理和辅助细节过滤原表达式无用的空格。对于单元运算符 /- 在左括号后的出现可以添加占位 0 构成 0 num 或 0 - num 的操作。对于一些特殊表达式如 -1 可以在数字栈放一个占位的 0保证每次的操作在数字栈中能有至少两个操作数。可以用一个哈希表维护各类运算符的优先级问题。下面是实例分析基本计算器 III 包含加减乘除小括号的综合应用展示。class Solution { private: // 规定运算符优先级 unordered_mapchar, int level { {, 1}, {-, 1}, {*, 2}, {/, 2}, }; // 预处理 // 过滤1. 空格 // 过滤2. 增加前导0 string filter(string t) { string s; // 过滤空格 stringstream ss(t); while (ss t) { s t; } // (- (0- for (int pos s.find((-); pos ! string::npos; pos s.find((-, pos)) { s.insert(pos 1, 0); } // ( (0 for (int pos s.find((); pos ! string::npos; pos s.find((, pos)) { s.insert(pos 1, 0); } return s; } // 单次操作 void calcStack(stackint numStk, stackchar opStk) { const int num numStk.top(); numStk.pop(); const char op opStk.top(); opStk.pop(); if (op ) { numStk.top() num; } else if (op -) { numStk.top() - num; } else if (op *) { numStk.top() * num; } else if (op /) { numStk.top() / num; } } public: int calculate(string s) { // 预处理字符串 s filter(s); // 数字栈运算符栈 stackint numStk; stackchar opStk; // 添加哨兵数字0 numStk.push(0); for (int i 0; i s.size(); i 1) { if (isdigit(s[i])) { int sum 0; for (; i s.size() isdigit(s[i]); i 1) { sum 10 * sum (s[i] - 0); } i -1; numStk.push(sum); } else { const char curOp s[i]; if (curOp () { opStk.push(curOp); } else if (curOp )) { // 不断弹栈直到出现( while (!opStk.empty() opStk.top() ! () { calcStack(numStk, opStk); } // 处理到最后的( opStk.pop(); } else { // 根据运算符优先级 while (!opStk.empty() opStk.top() ! ( level[opStk.top()] level[curOp]) { calcStack(numStk, opStk); } opStk.push(curOp); } } // if else } // for // 最后处理剩余的运算 while (!opStk.empty()) { calcStack(numStk, opStk); } // 最后栈顶的就是答案 return numStk.top(); } };小结表达式求值是数据结构的学习中非常经典的一个应用。将中缀表达式化为后缀表达式的核心就是两点后缀表达式的单次计算方式后缀表达式的生成方式。在考研中一般要求学生能够写出单次计算和后缀表达式生成的全过程。而求职中则需要能够 ac 掉笔试的代码题。因此每位读者都应该熟练掌握应对知识点和方法。最后基于双栈的方法除了处理本文中提到的常见四则运算外还可以针对四则运算以外的运算符或者自定义的运算符进行处理。对于这点读者可以作为拓展自行尝试。
http://www.zskr.cn/news/1354841.html

相关文章:

  • 2026南宁黄金回收TOP榜单,添价收稳坐头把交椅 - 薛定谔的梨花猫
  • 中壹鑫上海建设:上海工装公司电话 - LYL仔仔
  • 登上Nature正刊!阿里达摩院AI新突破
  • 2026年天津正规公墓服务机构推荐:合规资源・透明服务・人文安葬选择指南 - 海棠依旧大
  • Ryzen SDT调试工具深度解析:掌握AMD处理器底层调优的三大技术支柱
  • 为什么你的ChatGPT文章永远不进前10?资深SEO总监拆解4类高跳出率文案的语义断层真相
  • Taotoken 的 Token Plan 套餐如何让我的项目用模成本更可控
  • 添价收领衔:2026南宁黄金回收全方位测评 - 薛定谔的梨花猫
  • 如何快速部署原神Grasscutter工具:终极配置与使用指南
  • 3步实现容器镜像国内加速:DaoCloud镜像同步项目实战指南
  • 抖音下载神器:免费批量下载无水印视频的终极指南
  • Keil µVision中查看Object-HEX转换器命令行参数的方法
  • 抖音视频下载终极指南:专业高效的无水印批量下载解决方案
  • 免费音乐整合神器:3步打造你的专属音乐中心
  • Vue Antd Admin企业级后台架构深度解析:如何构建现代化中台管理系统解决方案
  • 2026 上海冷链零担 冷冻运输甄选指南 核心物流企业排名推荐 - 兔兔不是荼荼
  • 三步解锁:Chrome浏览器图片格式转换的终极解决方案
  • AI专著生成新趋势,20万字专著一键生成,写作效率直线提升!
  • HarmonyOS鸿蒙三方库移植:选 vcpkg 还是 lycium_plusplus?两种“框架化”方案对比
  • KanBots:开源看板工具,每张卡片跑一个并行 AI Agent,Hacker News 147 星炸裂
  • Viser 高级功能解析:Facet、Slider 和 Graph 组件的深度应用
  • 2026南溪县黄金回收避坑指南;闲置黄金变现;认准铭润金银回收,诚信靠谱 - 亦辰小黄鸭
  • React上下文菜单常见问题解答:解决10个典型使用难题
  • 如何突破数字枷锁:QMCDecode终极解决方案实现音频格式自由
  • B站成分检测器:5分钟快速上手智能识别工具
  • 2026南县黄金回收避坑指南;闲置黄金变现;认准铭润金银回收,诚信靠谱 - 亦辰小黄鸭
  • 3分钟彻底清理Windows右键菜单:ContextMenuManager让你的操作效率翻倍
  • 终极指南:如何用ncmdumpGUI轻松解锁网易云音乐NCM格式文件
  • 福正美上门回收黄金,只扣1元差价真实分享 - 上门黄金回收
  • SD-PPP:5分钟掌握Photoshop AI插件,让AI绘图更简单