使用棧實現表示式求值

2021-07-27 04:55:16 字數 1301 閱讀 9663

為了實現用棧計算算數表示式的值,需設定兩個工作棧:用於儲存運算子的棧opter,以及用於儲存運算元及中間結果的棧opval。

演算法基本思想如下:

(1)首先將運算元棧opval設為空棧,而將'#'作為運算子棧opter的棧底元素,這樣的目的是判斷表示式是否求值完畢。

(2)依次讀入表示式的每個字元,表示式須以'#'結尾,若是運算元則入棧opval,若是運算子,則將此運算子c與opter的棧頂元素top比較優先順序後執行相應的操作,(具體操作如下:(i)若top的優先順序小於c,即topc,則表明可以計算,此時彈出opval的棧頂兩個元素,並且彈出opter棧頂的的運算子,計算後將結果放入佔opval中。)直至opter的棧頂元素和當前讀入的字元均為'#',此時求值結束。

算符間的優先關係如下表所示:

具體**如下:

#include//輸入的表示式要以'#'結尾,如『5+6*3/(3-1)#』

#include#include#include#includeusing namespace std;

stackopter; //運算子棧

stackopval; //運算元棧

int getindex(char theta) //獲取theta所對應的索引

return index;

}char getpriority(char theta1, char theta2) //獲取theta1與theta2之間的優先順序

, ,

, ,

, ,

, };

int index1 = getindex(theta1);

int index2 = getindex(theta2);

return priority[index1][index2];

}double calculate(double b, char theta, double a) //計算b theta a

}double getanswer() //表示式求值

else

c = getchar();

} else

}} return opval.top(); //返回opval棧頂元素的值

}int main()

return 0;

}

結果:

表示式求值 棧實現

宣告 僅個人小記 演算法思想 一 設定乙個運算子棧,設定乙個字尾表示式字串 二 從左到右依次對中綴表示式中的每個字元ch分別進行一下處理,直至表示式結束 1.若ch是左括號 將其入棧 2.若 ch 是數字,將其後連續若干數字新增到字尾表示式字串之後,在新增空格作為分割符 3.若ch是運算子,先將棧頂...

表示式求值(棧)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入...

棧 表示式求值

核心演算法思想 1.運用兩個棧,乙個存運算子,乙個存數值 2.以 做為標誌位,開頭或者結尾 3.檢查當前字元,若當前字元為數值,則加入數值棧,若為運算子,則檢驗當前運算子的優先順序,1 若當前運算子優先順序大於棧頂優先順序,則把該運算子壓入棧 2 若當前運算子優先順序等於棧頂優先順序 括號的情況 則...