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

posted @ 2020-03-20 17:17  Jaywhenxiang  阅读(865)  评论(0编辑  收藏  举报