利用棧結構實現四則運算求值

2021-08-09 14:59:32 字數 994 閱讀 7028

文章目錄

5. 思考題

棧是計算機中非常基礎而又極其重要的一種資料結構,許多演算法的實現都離不開棧,它的特點是「先進後出」,也可以說「後進先出」。

打乙個形象的比方:棧好比乙個彈夾,最先放入的子彈只能最後打出;而最後放入的子彈則最先打出。

我們生活中接觸的表示式大部分都是中綴表示式,形如a + b,這種表示式的特點是將運算子放在了運算元之間,優點是便於人的理解,缺點是需要明確各種運算子的優先順序。

字尾表示式是將運算子放在兩個運算元之後,形如a b +,這種表示式對於計算機來說非常容易計算,因為只須從左往右運算即可,不必考慮運算子的優先順序。因此在計算機的實際運算中,採用的是字尾表示式的形式。

前面介紹了棧、中綴表示式以及字尾表示式的概念,現在我們就用棧這個資料結構來實現乙個基本的演算法——四則運算表示式的求值。下圖是實現這一演算法的總思路:

1. 第一遍掃瞄表示式時,遇到運算子則壓入棧中,遇到運算元則按順序取出,放入等待生成的字尾表示式中。

2. 若掃瞄運算子時遇到),說明棧中有(與之配對,此時應依次彈出運算子,放入等待生成的字尾表示式中,直到(從棧中彈出。

3. 若當前掃瞄的運算子優先順序低於棧頂運算子的優先順序,則應先彈出棧頂運算子,之後再把當前運算子壓入棧中。

接下來,我們來看乙個具體的例子。

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

4.2 計算字尾表示式

通過這個例子,我們看到了棧結構的優點:能夠儲存當前的資料狀態,等下次要回過頭來處理這一資料時時,可以回到之前的狀態進行處理。

看完了這一演算法的基本實現,不妨思考下面幾道題目用棧求值的過程。

1. (a + b) * c + d

2. a + (b * c)

3. a * b + c

4. a + b * (c + d)

雙棧 有括號的四則運算求值

題目都一樣,稍微改一下輸入。通過了以下 3 題的測試資料。其中,leetcode的兩題的測試資料不夠複雜 下面說明 的正確性,還需要更多的測試資料來測。224.基本計算器 227.基本計算器 ii 題目 1683 演算法3 4 表示式求值 leetcode 227 題的測試資料,沒有包含以下兩種情況...

棧 實現四則運算

題目描述 給定乙個字串描述的算術表示式,計算出結果值。輸入字串長度不超過100,合法的字元包括 0 9 字串內容的合法性及表示式語法的合法性由做題者檢查。本題目只涉及整型計算。題目描述 給定乙個字串描述的算術表示式,計算出結果值。輸入字串長度不超過100,合法的字元包括 0 9 字串內容的合法性及表...

利用棧的四則運算

利用表示式求值首先要會將中綴表示式變為字尾表示式,過程如下 中綴表示式 a b c d e a b c d e 將符號移到對應括號的後面。字尾表示式 ab cde 將表示式轉化為字尾後能方便利用棧進行計算。利用棧來化為字尾表示式的步驟如下 從左往右掃瞄中綴表示式。當讀到數字時,加入字尾表示式。讀到操...