這裏只講講思路,具體的代碼能夠去個人Github獲取。git
程序支持小數形式的邏輯運算,但精度不超過3位。
程序僅支持由如下運算符構成的邏輯表達式的運算:
+ - * / == != >= > <= < ( ) && ||
給定一個字符串:"4+5>=32||(2+3)==5.25"
對該字符串的語法檢查包括:github
- 對錶達式元素類型檢查,如:表達式中不能出現除上述運算符、0-9的數字、小數點以外的字符;
- 對運算數格式檢查,如:小數點在運算數中出現的位置、運算數的小數位數等;
- 對錶達式中左括號和右括號一致性檢查,如:對任意一個左括號是否總有一個右括號與之對應、每對括號中是否有值;
- 對錶達式中運算符位置合法性檢查,如:運算符左側和右側相鄰元素的類型、不能除以0等。
這裏轉爲前綴表達式是爲了方便後面的運算,主要思路以下:code
- 分割表達式字符串;
- 建立一個表達式元素棧,將分割後的運算符和運算數壓入棧,並對運算符劃分優先級;
- 再建立兩個棧,一個運算符棧,一個結果棧,運算符棧中初始壓入一個優先級最低的運算符,解決開始時候的邊界問題;
- 自棧頂至棧底掃描表達式元素棧,碰到運算數,就直接壓入結果棧,碰到運算符,則與運算符棧頂元素比較優先級:若是該運算符優先級大於等於棧頂元素,則將該運算符壓入運算符棧,不然運算符棧頂元素出棧並壓入結果棧,繼續比較,直到該運算符優先級大於等於棧頂元素的優先級時,將該運算符壓入運算符棧中;
- 若是遇到右括號直接壓入結果棧中,若是遇到一個左括號,就將運算符棧元素彈出並壓入結果棧(注意:兩個括號都不要壓入結果棧);
- 處理完表達式後,若是運算符棧中還有元素,則將元素依次彈出並壓入結果棧。
- 自棧底至棧頂遍歷結果棧;
- 遇到運算數時,將運算數壓入運算數棧,遇到運算符時,彈出結果棧棧頂的兩個元素,用該運算符對它們作相應的計算(棧頂元素 op 次頂元素);
- 將運算結果壓入運算數棧;
- 重複上述過程直到棧頂,最後算出的值就是表達式的值。