Ui界面的设计
界面设计如下:
QPushButton的创建
以按钮8为例,通过ui界面中PushButton添加8的按钮,然后以字符串的形式呈现在显示屏上,如下:
其槽函数代码如下:
void Widget::on_eight_clicked()
{
expression+="8";
ui->lineEdit->setText(expression);
}
主要函数实现
Judge函数(判断):
用来判断运算符的优先级
pre_expression函数(预处理):
·expression:为用户输入的原始表达式。
·返回值:字母中缀表达式。
zzzhz函数(中缀转后缀):
·zzzhz (QString pre_expression):用于将中缀表达式转换为后缀表达式。
·pre_expression:数据预处理的结果。
·返回值:返回的是一个队列q,里面存有后缀表达式。
cal函数(运算):
·cal(queue<QString> q):用于计算后缀表达式
·q:zzzhz函数所求的后缀表达式。
·返回值:返回的是一个字符串答案。
·wrong:当算术运算表达式不合法时报错。
关键算法分析
中缀表达式转后缀表达式
首先,需要定义一个操作符栈并且知道各运算符优先级,然后从左往右一次扫描字符(字符前后加#号),遇到数字直接输出,遇到操作符比较优先级。
栈顶优先级低,入栈;
栈顶优先级高,出栈并且输出;
优先级相等(即左右括号),出栈(不输出);
当扫描的字符为#并且栈顶字符为#时,此时输出的字符序列即为后缀表达式。
以下为列举的一个例子:
1. 初始化一个空栈。此桟用来对要运算的数字进出使用。
2. 后缀表达式中前三个都是数字,所以9、3、1进栈。
3. 接下来是减号“-”,所以将栈中的1出栈作为减数,3出栈作为被减数,并运算3-1得到2,再将2进栈。
4. 接着是数字3进栈。
5. 后面是乘法“*”,也就意味着栈中3和2出栈,2与3相乘,得到6,并将6进栈。
6. 下面是加法“+”,所以找中6和9出找,9与6相加,得到15,将15进栈。
7. 接着是10与2两数字进栈。
8. 接下来是符号因此,栈顶的2与10出栈,10与2相除,得到5,将5进栈。
9. 最后一个是符号“+”,所以15与5出找并相加,得到20,将20进栈。
10. 结果是20出栈,栈变为空。
后缀表达式求值
转换成后缀表达式后,即可利用后缀表达式进行求值,后缀表达式求值时,只需定义一个操作数栈,当从左往右扫描字符串时,扫描到数字时进栈,扫描到字符从栈中出两个数字,然后与扫描到的字符之间进行运算, ***<运算时注意:先出栈的做运算符的后操作数,后出栈的做前操作数>***当全部扫描完之后,栈顶的数字即为求值结果。
用户界面输入的容错机制
1)如果存在运算符,而队列中操作数小于2个
2)出现小数点前面自动补0
3) "+×÷)"不能跟在"+×÷("之后;
4)右括号数量不能超过左括号数量