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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM