基于Qt框架实现一个简单的计算器桌面程序
XCacl是一个基于Qt Creator开发的简单的四则运算计算器。程序本身来说非常简单,并无什么亮点,不过在写这个程序时用到的一些算法还是值得我记录的。
Developer:Jaywhen
📝: 程序代码:点个
star
再走吧🤩!
核心算法:
-
后缀表达式 (逆波兰式):
后缀表达式非常适合计算机来计算多项式,因为在后缀表达式中不存在括号以及优先级,计算后缀表达式只需使用栈即可
表示示例:
中缀:2+(4+6)x8-10 后缀:246+8x+10-
中缀表达式转后缀表达式的方法:
- 声明两个空栈(输出栈、运算符栈)
- 从左向右扫描中缀表达式,遇见数字将其压入输出栈
- 遇见操作符则将其与栈顶的操作符的优先级进行比较
如果该运算符的优先级比栈顶运算符的优先级高,则直接将其压入运算符栈中 如果该运算符的优先级低于或等于栈顶运算符的优先级,则从栈顶开始弹出运算符至输出栈,直至 遇见优先级比该运算符低的运算符时,将该运算符压入栈顶 特殊:如果该运算符为左括号`(`,直接将其压入栈顶,直到遇见右括号`)` 才将其中间的所有运算符弹出到输出栈,且将`(`与`)`弹出(丢弃,非弹出至输出栈) 若扫描完成后运算符栈中还有运算符,将其压入输出栈
- 此时将输出栈逆序一遍,就得后缀表达式
例如我们要将
中缀:2+(4+6)x8-10
转为后缀:246+8x+10-
:
初始化两个栈:
outputStack
(输出栈)以及operatorStack
(运算符栈)数字
2
压入输出栈此时运算符栈中无运算符,故
+
号压入运算符栈遇见
(
无视优先级,直接压入运算符栈数字
4
压入输出栈
+
号压入运算符栈,因为此时栈顶为(
,(
左括号 只有当遇见右括号)
时才能才能弹出数字
6
压入输出栈遇见
)
,此时运算符栈中有(从左到右为栈顶到栈尾):+ ( +
,故将栈顶的+
号弹出至输出栈,且()
弹出此时运算符栈中只剩下
+
号
x
号优先级比栈顶的+
号高,直接压入运算符栈栈顶数字
8
直接压入输出栈
-
号优先级比运算符栈栈顶的x
号低,此时运算符栈中有:x -
,都大于等于-
号的优先级,故将其全部压入输出栈,并将-
号压入运算符栈数字
10
压入输出栈扫描完成,此时运算符栈中还有
-
号,故将其压入输出栈此时输出栈中元素为:
-10+x8+642
逆序得246+8x+10-
后缀表达式的计算:
后缀表达式的计算方法非常简单,因为复杂的部分都在转换过程上了 首先申请一个栈来存储计算结果`resultStack` 从逆序的输出栈中依次取元素,遇到数字压入结果栈中 遇运算符则将结果栈中位于栈顶的两个元素取出做相应的运算, 运算顺序为(第二个数字) (运算符) (栈顶数字),并将结果压入结果栈中 最后结果栈中的数字即为结果
- 用上例所得的后缀表达式为例:
246+8x+10-
- 前三个元素都是数字,故直接压入结果栈中
- 此时我们的栈中就有:
6(栈顶) 4 2(栈底)
- 继续扫描,遇到
+
号,则将栈顶的两个元素取出做加法运算得4+6=10
- 此时栈中有:
10 2
- 继续扫描,数字
8
压入栈中- 继续扫描,遇
x
号,将结果栈栈顶二数字取出做10x8=80
,80
压入结果栈- 此时数字栈中有:
80 2
- 又遇
+
号,2+80=82
,压入数字栈- 数字
10
压入栈- 遇
-
号,82-10=72
, 验证:2+(4+6)x8-10=72
另附自己的一些Qt框架写的拙作:X系列