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

电商商城网站建设方案外贸网站分类

电商商城网站建设方案,外贸网站分类,百度搜索优化平台,天猫建设网站的理由C实现中缀表达式转后缀表达式及后缀表达式的计算 在C中,实现中缀表达式转换为后缀表达式(逆波兰表达式)以及后缀表达式的计算是一个非常经典的问题。它不仅涉及到栈(Stack)数据结构的使用,还涉及到对运算符…

C++实现中缀表达式转后缀表达式及后缀表达式的计算

在C++中,实现中缀表达式转换为后缀表达式(逆波兰表达式)以及后缀表达式的计算是一个非常经典的问题。它不仅涉及到栈(Stack)数据结构的使用,还涉及到对运算符优先级的处理。本文将详细介绍如何实现这一过程,并提供完整的代码实现。


一、中缀表达式转后缀表达式

中缀表达式(如 9+8*(7-6)-5/4)是我们日常使用的表达式形式,其中运算符位于操作数之间。而后缀表达式(逆波兰表达式)是一种不需要括号来标识优先级的表达式形式,运算符位于操作数之后(如 9 8 7 6 - * + 5 4 / -)。

将中缀表达式转换为后缀表达式的算法基于栈结构,主要步骤如下:

  1. 初始化:创建一个空栈用于存储运算符,创建一个空字符串(或列表)用于存储后缀表达式的结果。
  2. 遍历中缀表达式:从左到右依次处理中缀表达式中的每个字符。
    • 如果是操作数(数字),直接添加到后缀表达式中。
    • 如果是左括号 '(',直接压入栈中。
    • 如果是右括号 ')',则依次弹出栈顶运算符并添加到后缀表达式中,直到遇到左括号 '(',此时丢弃这对括号。
    • 如果是运算符(+-*/):
      • 如果栈为空,或栈顶是左括号 '(',或当前运算符优先级高于栈顶运算符,则将当前运算符压入栈中。
      • 否则,依次弹出栈顶运算符并添加到后缀表达式中,直到栈为空或栈顶运算符优先级低于当前运算符,然后将当前运算符压入栈中。
  3. 处理剩余运算符:遍历结束后,如果栈中仍有运算符,依次弹出并添加到后缀表达式中。

二、后缀表达式的计算

后缀表达式的计算同样基于栈结构,主要步骤如下:

  1. 初始化:创建一个空栈用于存储操作数。
  2. 遍历后缀表达式:从左到右依次处理后缀表达式中的每个字符。
    • 如果是操作数(数字),直接压入栈中。
    • 如果是运算符(+-*/):
      • 弹出栈顶的两个操作数,注意后弹出的操作数是第一个操作数。
      • 根据运算符对两个操作数进行计算,将结果压入栈中。
  3. 最终结果:遍历结束后,栈顶的元素即为最终计算结果。

三、代码实现

以下是完整的C++代码实现,包括中缀表达式转后缀表达式以及后缀表达式的计算。代码中还包含了调试信息的输出,方便理解每一步的操作。

#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <functional>
using namespace std;template<typename T>
void printVec(const string& msg, const vector<T>& vec)
{cout << msg << " | ";for (auto &v : vec)cout << v << '\t';cout << endl;
}// 中缀表达式转后缀表达式
string MidToRear(const string& mid)
{string rear; // 后缀表达式vector<char> stk; // 运算符栈// 定义优先级比较函数function<bool(const char&, const char&)> isPriorOperator = [](const char& A, const char& B){if (A == '-' || A == '+')return false;return B == '-' || B == '+';};for (const char& ch : mid){if (isdigit(ch)) // 如果是数字,直接加入后缀表达式{rear += ch;}else if (ch == '(') // 左括号直接入栈{stk.push_back(ch);}else if (ch == ')') // 右括号,弹出栈顶元素直到遇到左括号{while (stk.back() != '('){rear += stk.back();stk.pop_back();}stk.pop_back(); // 弹出左括号}else if (stk.empty() || isPriorOperator(ch, stk.back()) || stk.back() == '(') // 当前运算符优先级高或栈顶是左括号{stk.push_back(ch);}else // 当前运算符优先级低,弹出栈顶元素直到优先级合适{while (!stk.empty() && stk.back() != '(' && !isPriorOperator(ch, stk.back())){rear += stk.back();stk.pop_back();}stk.push_back(ch);}// 输出当前状态cout << "current ch: " << ch << "\trearExp: \t" << rear << endl;printVec("STACK:", stk);}// 处理栈中剩余的运算符while (!stk.empty()){rear += stk.back();stk.pop_back();}return rear;
}// 计算后缀表达式
double CalRear(const string& rear)
{vector<double> stk; // 操作数栈// 定义计算函数auto CalFunc = [](double a, double b, char op) -> double{if (op == '+')return a + b;else if (op == '-')return a - b;else if (op == '/')return a / b;else if (op == '*')return a * b;throw std::invalid_argument("error");};for (auto& ch : rear){if (isdigit(ch)) // 如果是数字,直接入栈{stk.push_back(ch - '0');}else // 如果是运算符,弹出两个操作数进行计算{double b = stk.back();stk.pop_back();double a = stk.back();stk.pop_back();double cal = CalFunc(a, b, ch);stk.push_back(cal);}// 输出当前状态cout << "current ch: " << ch << "\trearExp: \t" << rear << endl;printVec("STACK:", stk);}return stk.back(); // 栈顶元素即为最终结果
}int main()
{// 示例输入string mid;cout << "请输入中缀表达式(仅支持数字和 + - * / ( )): ";cin >> mid;// 中缀转后缀auto rear = MidToRear(mid);cout << "后缀表达式: " << rear << endl << endl;// 计算后缀表达式cout << "计算结果: " << CalRear(rear) << endl;return 0;
}

四、程序输出

以下是程序的运行输出示例,你可以根据实际输入填写输出结果。

输入示例:

9+8*(7-6)-5/4

输出示例:

 9+8*(7-6)-5/4
current ch: 9   rearExp:        9
STACK: |
current ch: +   rearExp:        9
STACK: | +
current ch: 8   rearExp:        98
STACK: | +
current ch: *   rearExp:        98
STACK: | +      *
current ch: (   rearExp:        98
STACK: | +      *       (
current ch: 7   rearExp:        987
STACK: | +      *       (
current ch: -   rearExp:        987
STACK: | +      *       (       -
current ch: 6   rearExp:        9876
STACK: | +      *       (       -
current ch: )   rearExp:        9876-
STACK: | +      *
current ch: -   rearExp:        9876-*+
STACK: | -
current ch: 5   rearExp:        9876-*+5
STACK: | -
current ch: /   rearExp:        9876-*+5
STACK: | -      /
current ch: 4   rearExp:        9876-*+54
STACK: | -      /
9876-*+54/-current ch: 9   rearExp:        9876-*+54/-
STACK: | 9
current ch: 8   rearExp:        9876-*+54/-
STACK: | 9      8
current ch: 7   rearExp:        9876-*+54/-
STACK: | 9      8       7
current ch: 6   rearExp:        9876-*+54/-
STACK: | 9      8       7       6
current ch: -   rearExp:        9876-*+54/-
STACK: | 9      8       1
current ch: *   rearExp:        9876-*+54/-
STACK: | 9      8
current ch: +   rearExp:        9876-*+54/-
STACK: | 17
current ch: 5   rearExp:        9876-*+54/-
STACK: | 17     5
current ch: 4   rearExp:        9876-*+54/-
STACK: | 17     5       4
current ch: /   rearExp:        9876-*+54/-
STACK: | 17     1.25
current ch: -   rearExp:        9876-*+54/-
STACK: | 15.75Cal ans:15.75
http://www.dtcms.com/a/544563.html

相关文章:

  • 做网站路径产品设计优秀网站
  • MetaGPT、AutoGen、XAgent camel仔细对比
  • 小白指南:Apache DolphinScheduler 补数据功能实操演示
  • 使用 JDOM 库生成 XML 文件并返回 File
  • 打工人日报#20251029
  • (107页PPT)食品零售行业数字化转型解决方案参考(附下载方式)
  • 【打靶日记】VulNyx 之 Lower5
  • Linux小课堂: LNMP架构下Discuz论坛部署全流程解析
  • 徐州网站建设推广做餐饮企业网站的费用
  • 网站搭建合同基于漏斗模型网站关键路径分析
  • 利用腾讯开源 Hunyuan3D 2.1:在 DigitalOcean GPU Droplet 上快速搭建 3D 模型
  • 【开题答辩全过程】以 多媒体素材管理系统为例,包含答辩的问题和答案
  • 聊聊高并发访问遇到过期的缓存项测试策略
  • 目标检测算法与原理(一):迁移学习
  • 第三章 线性模型
  • 【WordPress】Nova WordPress 主题:为内容创作者打造的极致体验
  • 网站一般几年创新的沈阳网站建设
  • 惠普电脑网站建设策划方案h5模板下载有哪些网站
  • 怎么做网站seo山东省旅游网站建设
  • web网页,在线%抖音,舆情%分析系统demo,基于python+web+echart+nlp+知识图谱,数据库mysql
  • 把浅色的pdf文件加深
  • Actix-Web 框架实战:构建高性能 RESTful API 服务
  • 边缘计算中针对不同类型的任务(如分类、回归)评估指标
  • 【16】C语言-编辑`task.json`文件以改变警告等级
  • Rust高性能优化与零拷贝技术深度实践
  • Linux-Redhat系统启动读取文件流程
  • React 10
  • 京东方 EV101WXM-N10 工业液晶模组技术摘要
  • Deep End-to-End Alignment and Refinement for Time-of-Flight RGB-D modules复现
  • Java-163 MongoDB 生产安全加固实战:10 分钟完成认证、最小权限、角色详解