Golang 實現計算器

2021-09-14 04:06:26 字數 1969 閱讀 9975

如果只能進行兩個值的加減乘除,如何程式設計計算乙個數學表示式的值?

比如計算1+2*3+(4*5+6)*7,我們知道優先順序順序()大於* /大於+ -,直接計算得1+6+26*7 = 189

人利用中綴表示式計算值

數學表示式的記法分為字首、中綴和字尾記法,其中中綴就是上邊的算術記法:1+2*3+(4*5+6)*7,人計算中綴表示式的值:把表示式分為三部分12+3(4*5+6)*7分別計算值,求和得 189。但這個理解過程在計算機上的實現就複雜了。

計算機利用字尾表示式計算值

中綴表示式1+2*3+(4*5+6)*7對應的字尾表示式:123*+45*6+7*+,計算機使用棧計算字尾表示式值:

計算字尾表示式的**實現

func calculate(postfix string) int 

fixlen := len(postfix)

for i := 0; i < fixlen; i++ else }}

result, _ := strconv.atoi(stack.top())

return result

}

現在只需知道如何將中綴轉為字尾,再利用棧計算即可。

轉換過程

從左到右逐個字元遍歷中綴表示式,輸出的字串行即是字尾表示式:

中綴表示式遍歷完畢,運算子棧不為空則全部彈出,依次追加到輸出

轉換的**實現

// 中綴表示式轉字尾表示式

func infix2topostfix(exp string) string

postfix := ""

explen := len(exp)

// 遍歷整個表示式

for i := 0; i < explen; i++

postfix += prechar

stack.pop()

}// 數字則直接輸出

case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9":

j := i

digit := ""

for ; j < explen && unicode.isdigit(rune(exp[j])); j++

postfix += digit

i = j - 1 // i 向前跨越乙個整數,由於執行了一步多餘的 j++,需要減 1

default:

// 操作符:遇到高優先順序的運算子,不斷彈出,直到遇見更低優先順序運算子

for !stack.isempty()

postfix += top

stack.pop()

}// 低優先順序的運算子入棧

stack.push(char)}}

// 棧不空則全部輸出

for !stack.isempty()

return postfix

}// 比較運算子棧棧頂 top 和新運算子 newtop 的優先順序高低

func islower(top string, newtop string) bool

case "(":

return true

}return false

}

計算機計算數學表示式的值分成了 2 步,利用 stack 將人理解的中綴表示式轉為計算機理解的字尾表示式,再次利用 stack 計算字尾表示式的值。

實現計算器

dim boldot as boolean dim dblacc1,dblacc2 as double dim dblacc3 as double 10 dim strop as string private sub add num byval intnumber as integer if bol...

計算器的實現

計算器?不是非常簡單嗎?宣告兩個float型變數,再加上操作符,自動計算結果出來!public static float calc float a,float b,int operator 呵呵,這麼簡單,那就沒必要寫成文章了 這裡要說的是 程式計算表示式的值,比如 1 2 3 5 9 就是簡單兩個...

QT實現計算器

1 新建calculatorstandard類和工程檔案 2 使用水平布局和把按鍵依次新增 ui介面如下圖所示 3 在calculatorstandard.h中宣告用到的槽函式 private slots void digitclicked 數字按鍵 void addandsubclicked 加減...