棧與四則運算

2022-09-06 00:12:22 字數 1733 閱讀 9384

在此之前,需要說明的是,很多程式語言在進行四則運算的時候,都不是直接運用中綴表示式進行運算的,一般會將中綴表示式轉換為字尾表示式然後利用棧進行具體的運算。因為,計算機無法識別所謂的先乘除後加減的運算順序的,而且,一旦出現括號的表示式,按照中綴表單時處理起來更困難,所以,一般來說,很多程式語言在進行四則運算的時候,都會講中綴轉換為字尾,因為,字尾(字首也是)表示式有個很好的有點:它沒有括號,結合順序完全是按照符號出現的順序進行的,所以無需考慮過多的其他問題。

一、字首、中綴以及字尾表示式的概念

1、首先說中綴,它最簡單,就是我們平常寫的算式。1+2*3-(4-2),這個我們平常用的算式書寫方式就是中綴:中,代表符號是位於中間的,它進行和兩邊的資料進行結合並運算得出結果。

2、字尾:符號位於兩個數字之後,例如:1+2的字尾表示式就是1 2+;1+2*3的字尾表示式就是:1(23*)+;如果理解不了,看下面的醜圖理解:

這裡要注意的是:符號的結合順序是從最左邊那個符號(這裡是*)進行結合的,例如:

123*-3+等價於2*3 - 1 + 3,具體看醜圖;同樣,字首也遵循類似的原則,只不過它是從右往左結合(即最右邊的符號優先結合)

記住:2*3是顯式加上了括號的,為了方便理解,下面的式子涉及到乘除我也會自動為他們的運算加上括號。

3、字首:其實理解了字尾,字首就很好理解了,字首就是將符號放在數字的前面而已,結合的方式就是符號結合後面兩個數字,例子

2*3 - 1 + 3的字首表示式為:+-*2 3 1 3(最右邊符號優先結合);

二、中綴和字尾的轉換

例如以下的中綴表示式:((2-(3*5))-(4/2));(注意,演算法顯式加上括號)

具體轉化的方法是:遇到數字,直接輸出;遇到左括號,直接忽略;遇到符號,將符號壓入棧,遇到右括號則彈出棧中的符號。

ok,下面的**展示了這個過程:

//中綴表單時到字尾表示式的轉換

public string change(string express)else if(expresschar[i]=='*' || expresschar[i]=='-' || expresschar[i]=='+' || expresschar[i]=='/')else if(expresschar[i]==')')else

} return rtn;

}

當然,這種方法有一定的侷限性:需要顯式地加上括號才可以轉換成功,所以忽略了乙個步驟就是顯式為表示式加上必須的括號。不過這不是我們討論的主題,我們主要是用這個例子說明棧的乙個典型作用罷了。

三、利用字尾表示式進行四則運算

在三中,得到了四則表示式子的表示式之後,我們就可以運用棧進行四則運算了,而運算的方法是這樣:在字尾表示式中,我們遇到運算元,則將運算元推進棧中,遇到操作符,則從棧中推出兩個數字進行運算,並同時把運算結果推進棧中即可;迴圈以上步驟直到所有操作符以及運算元遍歷完畢。

下面簡單貼上該過程的**:

//利用字尾表示式進行四則運算

public int operation(string suffix)else }}

return stack.pop();

}

總而言之,棧是乙個非常重要且基礎的資料結構,很多計算機程式語言底層其實就提供了棧的原始實現。例如,我們在巢狀呼叫函式(例如遞迴)時,就是乙個典型的入棧出棧過程:先被呼叫的函式最後才結束運算;後被呼叫的函式後面執行,棧充當中間儲存資料和運算狀態的角色,保證運算正常運算下去。

Python 棧 四則運算

首先了解一下棧 棧是限定僅在表尾進行插入和刪除操作的線性表。允許插入與刪除的一段叫做棧頂,另一端 叫做棧底,不含任何資料元素的棧稱為空棧。棧又稱為後進先出 last in first out 的線性 表,簡稱lifo結構。在python中,可以用列表來實現棧 lt 3 相當於壓棧 print lt ...

棧 實現四則運算

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

棧應用 四則運算

輸入字串格式的算術表示式,如 3 2 輸出去結果。棧的應用 四則運算分為下列四個過程 讀取字串 並不是簡單地讀入,比如 當字串中有兩位數,例如12時,我們應該讀成 12 而不是 1 2 不然運算會出現錯誤 處理字串,給字串加0 為了保證字尾運算的正常執行,需要對出現的負數進行考慮。例如 4 3 為了...