四則運算表示式part1(中綴表示式轉字尾表示式)

2021-09-23 14:29:54 字數 1195 閱讀 9283

後續利用字尾表示式及**實現看part2

例子:1+2*3+(4*5+6)-10

利用兩個棧數字棧numstack和操作符棧opstack。從左向右遍歷四則表示式,遇到數字直接入數字棧,遇到操作符如果操作符棧為空則直接入操作符棧,否則判斷操作符棧頂元素優先順序是否比當前操作符低。如果低的話就入操作符棧,如果高得話就將操作符棧元素出棧壓入數字棧,一直出棧到操作符棧頂元素比當前元素低或者棧頂元素為左括號為止。遇到右括號也將操作符棧元素出棧壓入到數字棧,一直到棧頂元素為左括號為止。只有在遇到" ) "的情況下我們才彈出" ( ",其他情況我們都不會彈出" ( "。

下面看具體例子。

1.首先,遇到的是數字1和操作符+,分別入數字棧和操作符棧。當前為numstack=[1],opstack=[+];

2.遇到數字2和操作符*。數字直接入棧,opstack雖然不為空,但是棧頂元素+優先順序小於*,*直接入操作符棧。當前為numstack=[1,2],opstack=[+,*];

3.遇到數字3操作符+,數字直接入數字棧,opstack不為空,且棧頂元素*優先順序大於+,所以操作符棧要出棧元素壓入數字棧,知道操作符棧頂元素優先順序小於+,或為空為止。然後再將+入棧。當前為numstack=[1,2,3,*,+],opstack=[+];

4.遇到左括號直接入操作符棧。當前為numstack=[1,2,3,*,+],opstack=[+,(];

5.遇到4*,數字入數字棧,操作符棧頂元素+優先順序小於*,直接入棧。當前為numstack=[1,2,3,*,+,4],opstack=[+,(,*];

6.遇到5+,數字進數字棧,+優先順序小於操作符棧頂元素*,操作符出棧壓入數字棧【*】,然後+入棧。當前為numstack=[1,2,3,*,+,4,5,*],opstack=[+,(,+];

7.遇到6),6如數字棧。遇到),彈出操作符棧,直到遇見(為止。當前為numstack=[1,2,3,*,+,4,5,*,6,+],opstack=[+];

8.遇到-10,操作符-優先順序不大於棧頂元素+,操作符出棧到為空然後-入棧。然後數字如數字棧。當前為numstack=[1,2,3,*,+,4,5,*,6,+,+,10],opstack=[-];

9.操作符棧彈出到空為止,入棧數字棧numstack=[1,2,3,*,+,4,5,*,6,+,+,10,-]

所以1+2*3+(4*5+6)-10的字尾表示式為123*+45*6++10-。

後續利用字尾表示式及**實現看part2

四則運算表示式求值

03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...

四則運算表示式求值

表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...

四則運算表示式總結

這兩周完成了第乙個個人專案 四則運算表示式。在整個開發的過程中我有一些收穫也發現了自身的一些問題。下面就分條簡述一下。1 實現隨機生成任意長度的四則表示式 括號 2 實現四則表示式的計算 包括分數 3 實現接收使用者對某四則運算表示式計算的結果並判斷正確性。4 實現結合1 2 3功能的mfc應用程式...