
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系列
