> # ♻️ 资源
> **大小:** 522KB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010508**](https://www.yuque.com/sxbn/ks/100010508)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87400269**](https://download.csdn.net/download/s1t16/87400269)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> 
# 1. 分析
## 1.1 背景分析
如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题。任何一个表达式都是由操作数、操作符和分界符组成的。
算数表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表达式,即二元运算符位于两个运算数中间。为了正确执行这种中缀表达式的计算,必须明确各个操作符的执行顺序。为此每个操作符都规定了一个优先级。
C++ 规定,一个表达式中相邻的两个操作符的计算次序为:优先级高的先计算;如果优先级相同,则自左向右计算;当使用括号时,从最内层的括号开始计算。
由于中缀表达式中有操作符的优先级问题,还有可加括号改变运算顺序的问题,所以对于编译程序来说,一般不适用中缀表示处理表达式。解决办法是用后缀表示。
## 1.2 功能分析
作为能实现将中缀表达式转换为后缀表达式的程序,首先应能正确读入用户想要转换的中缀表达式(该中缀表达式是在一行中给出以空格分隔不同对象的中缀表达式,可包含 +-*/以及左右括号,表撒施不超过 20 个字符)。
之后可以根据相应的规则和各运算符的优先级正确无误的将中缀表达式转化为后缀表达式。
最后可以向用户输出转化好的后缀表达式(同时要求,在一行中输出转化后的后缀表达式,要求不同对象之间以空格分隔,但是结尾不得有多余空格)
# 2. 设计
## 2.1 数据结构设计
使用一个操作符栈用于表达式转换。
同时设定两个优先级,isp 是栈内优先数,icp 是栈外优先数,取值如下
```c
int isp(char ch)
//栈内优先级
{
switch (ch)
{
case '#':
return 0;
case '(':
return 1;
case '*':
case '/':
return 5;
case '+':
case '-':
return 3;
case ')':
return 6;
}
}
int icp(char ch)
//栈外优先级
{
switch (ch)
{
case '#':
return 0;
case '(':
return 6;
case '*':
case '/':
return 4;
case '+':
case '-':
return 2;
case ')':
return 1;
}
}
```
左括号的栈外优先数最高,它一来到立即进栈,但当它进入栈中后,其栈内优先数变得极低,以便括号内的其他操作符进栈。其他操作符进入栈中后优先数都升 1,这样可体现在中缀表达式中相同优先级的操作符从左向右计算的要求,让位于栈顶的操作符先退栈听输出。操作符优先数相等的情况只出现在括号配对或栈顶的‘#’号与输入流最后的‘#’号配对时。前者将见徐退出位于栈顶的操作符,直到遇到左括号为止。然后将左括号退栈以对消括号,后者将结束算法。
## 2.2 类结构设计
设计表达式类,用于储存用户输入的中缀表达式和待输出的处理后的后缀表达式;同时维护操作符栈用于转换表达式。
## 2.3 成员与操作设计
表达式类(Express)
私有成员:
```c
string _express; //储存中序表达式
int _current = 0; //表达式的定位变量
string _next; //下一个内容
string _result; //储存后缀表达式
stack<char> OpCode; //操作符栈
```
表达式类的构造函数:
```c
Express() = default;
Express(string &buf);
Express::Express(string & buf)
//对表达式进行一些处理,在结尾添加下面内容用于判断终止
:_express(buf)
{
_express.push_back(' ');
_express.push_back('#');
_express.push_back(' ');
}
```
公有操作:
```c
void NextContent(); //寻找下一个对象
void Change(); //将中序表达式转化为后续表达式
void ShowResult(); //输出结果(结尾不能有空格)
```
## 2.4 系统设计
系统首先读入用户输入的中缀表达式,并构建以该表达式为基础的表达式类,之后调用相应的算法将中缀表达式转换为后缀表达式。最后按照正确的格式输出后缀表达式。
# 3. 实现
## 3.1 表达式转换功能的实现
### 3.1.1 表达式转换功能流程图

### 3.1.2 表达式转换功能核心代码
```c
void Express::Change()
{
OpCode.push('#'); //操作符栈初始化,将结束符#进栈
NextContent(); //读入中缀表达式字符流的首字符
while (!OpCode.empty())
//循环做, 直到ch=='#', 同时栈顶的操作符也是'#', 停止循环
{
char ch = _next[0];
if (MyisNum(_next)) //如果是操作数, 直接读入下一个字符
{
_result.append(_next); //添加到结果当中
_result.push_back(' ');
NextContent();
}
else if (ispunct(ch)) //如果是操作符, 判断ch的优先级icp和当前栈顶操作符的优先级isp
{
char topch = OpCode.top();
if (isp(topch) < icp(ch)) //当前操作符优先级大,另ch进栈,读入下一个字符
{
OpCode.push(ch);
NextContent();
}
else if (isp(topch) > icp(ch)) //当前优先级小,退栈并输出到结果中
{
_result.push_back(OpCode.top());
_result.push_back(' ');
OpCode.pop();
}
else
{
if (OpCode.top() == '(') //如果退出的是左括号则读入下一个字符
{
NextContent();
}
OpCode.pop();
}
}
}
}
```
### 3.1.3 表达式转换功能截屏示例

神仙别闹
- 粉丝: 4657
- 资源: 7570
最新资源
- RHEL9环境下Python和PHP的安装及应用指南
- 基于OpenCV与Python的车道线智能检测系统:从图像预处理到UI界面的实现,基于OpenCV与Python的车道线智能检测系统(带UI界面):从图像预处理到霍夫直线检测与拟合的自动驾驶核心技术解
- FMETP STREAM EditionS
- 【大作业-36】基于yolov8和yolo11的绝缘子缺陷检测系统.zip
- 基于LSTM的时间序列预测模型:单输入单输出预测,数据存入Excel,性能评估指标包括决定系数R2、平均绝对误差MAE及平均相对误差MBE的详解代码,基于LSTM的时间序列预测模型:单输入单输出预测
- 清华大学第四弹-deepseek+Research让科研像聊天一样简单
- 使用Android手机的摄像头,通过闪光灯识别手指的血管,完成心率的检测,绘制出心率图
- 基于随机森林算法RF的数据分类预测详解:从代码注释到Excel数据存储的全面指南,基于随机森林算法RF的数据分类预测详解:从代码注释到Excel数据存储之道,基于随机森林算法RF的数据分类预测 代码含
- 呼气式酒精检测仪压力传感器US9411规格书V6.0:参数特性、应用领域及订购指南
- coreutils+wget.zip
- Nginx 服务器安装及配置文件详解.docx
- 资源-网络工程师知识点
- CCNA课件14节课程,pdf课件
- 《免费模电-Multisim电路仿真大合集(120例)-电子类专业实验/毕设实战资源库》
- stm32f103c8
- SDN 架构图.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


