該方法來自嚴蔚敏版資料結構,基本思路是:設定兩個工作棧,乙個運算元棧,乙個操作符棧,在(自左至右)掃瞄算術表示式時,遇到運算元直接入運算元棧,若遇到操作符,則根據操作符優先順序判斷下一步操作(
「操作符優先順序規則
」):若其優先順序高於棧頂操作符,則入棧,否則(相等或小於),彈出棧頂算符並從運算元棧彈出兩個運算元,計算,將計算結果入運算元棧,繼續比較與棧頂操作符的優先順序,若仍然等於或低於之,則計算,直至大於之,則將此操作符入棧;左括號一定入棧,且其優先順序低於後續來到的任何操作符,右括號一定出棧並計算直至遇到左括號,另外棧的開始以「#」開始,算術表示式以「#」結束,做結束標誌。當棧空時,計算結束。
採用字尾表示式,即「逆波蘭式」,因為計算機處理字尾表示式求值問題比較方便,在計算時只需要乙個運算元棧,即:將遇到的運算元入棧,凡是遇到操作符便從棧中彈出兩個運算元執行計算,並將結果存於棧中,直到字尾表示式的最後乙個操作符處理完畢,最後乙個入棧的數值即為最終的表示式的值。這裡的關鍵是怎樣求得表示式的字尾表示式,其規則與方法1的
「操作符優先順序規則」
基本一致,具體是這樣的:轉化過程只需要乙個操作符棧,自左至右掃瞄表示式過程中,遇到數字直接入字尾表示式,遇到操作符根據操作符優先順序規則出入棧,出棧後直接寫入字尾表示式。得到字尾表示式後在計算便簡單了。
新來操作符優先順序規則:
(1)若不高於棧頂符號優先順序,則棧頂先出棧,繼續比較後續棧頂符號,直至遇到低於自己的符號,則自己入棧;
(2)高於棧頂符號優先順序,直接入棧
(3)左括號「(」直接入棧
(4)右括號「)」不入棧,依次彈出棧內操作符,直至遇到「(」
(5)在開始和結束配合使用「#」,終結運算的標誌
不好理解的話,可以自己舉例按照上述規則操作一遍,就容易記住了。
簡單表示式求值 算符優先法
周五加班的時候,在九度oj上練習了一道簡單表示式求值的題目,用到了 算符優先法 這裡簡單的記錄一下 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,...
資料結構 算術表示式 算符優先法
還新增了乘方的優先順序,自行參考 一開始我寫的只能輸入個位數,後來想了好久才解決,主要是在判斷是否為運算子後,若不是運算子,別急著入棧,用乙個標記陣列記著,若下乙個字元還不是運算子,則利用strcat函式鏈結之前標記陣列和這乙個字元,直到下乙個字元是運算子為止,才入棧。至於負數的運算,則要判斷是否連...
lua算術表示式優先順序筆記
從低到高 and or not 右連線 最左推導的文法上的設計應該 高優先順序的表示式總是作為低優先順序表示式的最小不可分割因子 是 e eandandort eorandort andort andort andort logict andort logict andort logict ando...