计算只含加减乘除的中缀表达式

news/2025/3/28 8:24:01/文章来源:https://www.cnblogs.com/Thin-time/p/18791092

思路

计算中缀表达式分为两部分:中缀表达式转后缀表达式、后缀表达式的计算。均需要使用栈。

中缀表达式转后缀表达式

  1. inex:中缀表达式,postex:后缀表达式,stk运算符
  2. 遍历inex
  3. 如果为运算数,则直接添加到postex
  4. 如果为(,则直接入栈stk
  5. 如果为),一直取出栈顶元素(运算符),直到栈顶运算符为(为止,取出(,不将)入栈
  6. 如果为+-*/运算符,规定为两种优先级。只有目前操作运算符优先级高于栈顶运算符优先级(或者栈空)时才能直接入栈,小于或等于栈顶优先级(注意栈空是直接入栈,所以先处理前者更为简便)需要一直出栈,直至满足当前运算符优先级大于栈顶运算符优先级(或者栈已空),将运算符入栈。出栈的运算符直接添加到postex
  7. 将栈中剩余的运算符依次添加到postex中。这样得到的postex就是后缀表达式。

后缀表达式的计算

  1. 遍历postex
  2. 如果是运算数,则直接入栈
  3. 如果是运算符,则依次取出两个栈顶元素$$a\b$$,将运算结果$$b xx a$$入栈
  4. 循环结束,栈中只剩余一个数,该数就是中缀表达式的运算结果

示例代码

#include<bits/stdc++.h>using namespace std;#define ll long long
//#define int ll
#define pii pair<int, int>
#define all(x) x.begin(),x.end()
#define fer(i, m, n) for(int i = m; i < n; ++i)
#define ferd(i, m, n) for(int i = m; i >= n; --i)
#define dbg(x) cout << #x << ' ' << char(61) << ' ' << x << '\n'const int MOD = 1e9 + 7;
const int N = 2e5 + 2;
const int inf = 1e9;// 中缀表达式转后缀表达式
void InexToPostex(string inex, string& postex) {stack<char> stk;map<char, int> mp = {{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};for(char c : inex) {if(c >= '0' && c <= '9') postex += c;else if(c == '(') stk.push(c);else if(c == ')') {while(!stk.empty() && stk.top() != '(') postex += stk.top(), stk.pop();stk.pop();}else if(stk.empty() || mp[c] > mp[stk.top()]) stk.push(c);else if(mp[c] <= mp[stk.top()]) {while(!stk.empty() && mp[c] <= mp[stk.top()])postex += stk.top(), stk.pop();stk.push(c);}}while(!stk.empty()) postex += stk.top(), stk.pop();cout << "postex: " << '\n';for(char c : postex) cout << c << ' ';cout << '\n';
}// 后缀表达式计算
void cal(string postex) {stack<int> stk;for(char c : postex) {if(c >= '0' && c <= '9') stk.push(c - '0');else{int a = stk.top(); stk.pop();int b = stk.top(); stk.pop();if(c == '+') stk.push(a + b);else if(c == '-') stk.push(b - a);else if(c == '*') stk.push(a * b);else if(c == '/') stk.push(b / a);}}cout << "ans: " << stk.top() << '\n';
}signed main() {ios::sync_with_stdio(false); cin.tie(nullptr);string inex, postex;cin >> inex;InexToPostex(inex, postex);cal(postex);return 0;
}

样例输入输出

输入

2*(3+5)+7/1-4

输出

postex: 
2 3 5 + * 7 1 / + 4 - 
ans: 19

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/905369.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DVWA靶场安装教程

1 靶场下载github 下载 https://github.com/digininja/DVWAgithub网站在国外,有时不能访问,可以下载我分享的这个:百度网盘分享 https://pan.baidu.com/s/1vIsf_VFiY9Ah3DG3Ichsyg?pwd=zyvf 2 靶场部署 2.1 解压缩靶场 解压缩后,只保留DVWA-master文件夹,里面是靶场代码…

leaflet框选范围下载地图离线瓦片:以高德地图为例(附源码下载)

demo源码运行环境以及配置运行环境:依赖Node安装环境,demo本地Node版本:14.19.1。 运行工具:vscode或者其他工具。 配置方式:下载demo源码,vscode打开,然后顺序执行以下命令: (1)下载demo环境依赖包命令:npm i (2)启动Node后端接口命令:node nodeServer.js (3)打…

Python 也能做前端?用 Streamlit + LangChain 搭建 AI Chat 应用!

项目成果 使用 LangChain 处理对话逻辑,包括消息存储、上下文管理。 使用 Streamli项目成果使用 LangChain 处理对话逻辑,包括消息存储、上下文管理。 使用 Streamlit 构建前端 UI,实现流式输出对话体验。 调用 OpenAI API 进行智能问答,使 AI 能够自然交互。 支持对话历史…

春雨

在某一瞬间抛下了自己的灵魂,任由祂对着死去的肉体宣泄、嘶吼、哀悼。 折断笔不去书写过往,可回想的每一刻都值得记录。 工作、学习、人际关系、比赛、生活, 或者说焦虑、压力、责任、情感、不甘, 为什么不想想,把生活放到第一位。 在这苦难中,对知识的渴望和情感的向往刺…

leetcode每日一题:对角线上不同值的数量差

题目 2711. 对角线上不同值的数量差 给你一个下标从 0 开始、大小为 m x n 的二维矩阵 grid ,请你求解大小同样为 m x n 的答案矩阵 answer 。 矩阵 answer 中每个单元格 (r, c) 的值可以按下述方式进行计算:令 topLeft[r][c] 为矩阵 grid 中单元格 (r, c) 左上角对角线上 不…

Linux基本功

知识来源:B站-尚硅谷-武晟然 https://www.bilibili.com/video/BV1WY4y1H7d3/?spm_id_from=333.337.search-card.all.click&vd_source=d9e91669cbb2a200e91188c38bf38a7a 第01章_常用基本命令 ​ Shell 可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。我…

宝塔部署的Java项目通过域名无法访问问题

背景 1.域名已经绑定IP 2.端口已经开放,宝塔和云服务器的端口设置都开放 3.测试通过公网IP:port可以访问 4.通过域名:port不可以访问 猜测1: Java 项目未绑定到0.0.0.0 Java 项目默认监听 127.0.0.1(仅允许本地访问),无法通过公网 IP 或域名访问。 解决方案:启动 Java 项目…

知识库管理:全流程智能化中枢,驱动企业信息资产高效流转

思通数科智能系统的知识库管理模块,以多模态数据管理为基础,深度融合AI技术与精细化流程控制,构建从内容创建、智能分类到版本追溯的全生命周期管理体系,助力企业实现知识资产的安全存储、高效利用与持续优化。以下是核心功能详解: 一、多模态数据统一存储:打破信息孤岛,…

IPD流程中的风险管理与应对方法

IPD(Integrated Product Development)流程即集成产品开发流程,是一套产品开发的模式、理念与方法。它强调将产品开发视为一个完整的流程,涵盖从市场需求分析、产品规划、设计开发到产品上市及后续维护等各个环节。在当今复杂多变的商业环境中,IPD流程对于企业提升产品竞争…

9.0预览文件失败, 提示需要创建FileUpLoadsTempfilePath并授权

原因: 程序目录下已存在的FileUpLoadTempfilePath对比路径缺少了s, 正确为FileUpLoadsTempfilePath, 如下图.

如何设计一个便携式温度计- NFC/ QT PY/ SHT40

无论你走到哪里,检查周围的温度和湿度,这是一个紧凑的无电池设计! 智能手机虽然功能齐全,功能强大,但由于其设计和主要用途,它并不是理想的温度计。它们的内部温度传感器是用来监测设备性能的,而不是环境条件,它们会受到手机本身和周围环境产生的热量的影响,导致读数不…

hive 异常问题汇总

问题1:创建数据库时报错ERROR : FAILED: Execution Error, return code 40000 from org.apache.hadoop.hive.ql.ddl.DDLTask. MetaException(message:Failed to create external path hdfs://192.168.197.130:9000/user/hive/warehouse/test.db for database test. This may r…