(二)练手项目一日志12.1
Github:https://github.com/kevin-lh/SoftwarePractice/tree/main/myCalculator
前言
本文主要阐述算术表达式运算——双栈运算符优先级法, 以及项目中的模块设计一、详细设计
项目文件结构如下:
其中model.h 与 model.cpp 为之前实现简单四则运算的文件,因为现在加入了算术表达式求值,封装成了另一个函数,所以已舍弃~~~
1.1 UI界面完善
因为加入了算术表达式功能,因此对UI界面进行了更改:
加入了 “(”,“)”,“DEL”,“r” 四个button,分别对应功能如下
“(”——左括号;
“ )”——右括号;
“DEL”——删除;
“r”——显示上一个运算;
1.2 双栈运算符优先级法
运算的过程如下:
1)初始化两个栈,分别用于存放运算符和数字。接收这一整串的字符串,并从第一个字符开始,遍历字符串。
2)遇到左括号,忽略。
3)遇到数字,存入数字栈;遇到运算符,存入运算符栈。
4)遇到右括号,开始计算,取出数字栈最顶上两个元素,以及运算符栈最顶上一个元素,用数字栈倒数第二个元素通过运算符和第一个元素进行运算。
5)将计算的结果再压入数字栈。
6)重复2-5,直到遇到最后一个括号,则计算结束,返回最终数字栈中的唯一元素。
举例说明:
1.3 实现函数
在dialog.h中,声明以下公有函数:
//2020.12.1新增
void init();//初始化堆栈
int getLevel(const QChar& oper);//得到运算符等级
void toPostfix();//转成后缀表达式
void evaluation();//求解
void digitBtn(char ch);//显示
定义堆栈及以下私有变量:
//2020.12.1新增
QStack<QChar> expStack;//后缀表达式栈
QStack<QChar>opStack;//运算符栈
QString postfix;//存储后缀表达式
bool complete;//运算是否完成
int lefts;
函数实现在dialog.cpp
二、日志
今天主要实现了上述算术表达式的计算功能
测试用例
(1)3*(8-2)
(2)1+(2-1/2)*2
总结
今天实现了上述算术表达式的计算功能,但 DEL(逐个删除)功能还未实现,r(显示上一个运算)的功能也未实现