資料結構 中綴表示式求值解法

2021-08-02 04:29:38 字數 2749 閱讀 4464

簡述中綴表示式的做題思想:

例如:輸入乙個表示式為(3+2*5)-3*(1+3)/4-2

定義兩個棧,乙個是操作符棧(sdoc),乙個是運算元棧(sdop)

1.首先判斷輸入的字元是數還是操作符

如果是運算元:

char cinch;int x;

while((cinch=getchar())!=' \n ') //此處是輸入函式並且不為回車時繼續輸入字元

while ((c=getchar())!='\n') 

其中c=getchar()是輸入乙個字元,賦值給變數c, while ((c=getchar())!='\n') 就是當輸入的字元c不是回車的時候,一直迴圈。

判斷乙個字串是否是數字用isdigit函式 標頭檔案是#include,可以判斷操作符是否為0-9之間的數字

if  isdigit(cinch)

然後這裡涉及到乙個cin.putback函式來做當輸入數字是1位數以上的數字

if(isdigit(cinch)) 

cin.putback的解釋用法是:

cin.putback(c)是將字元c放回到輸入流中,這樣後面用cin>>n時可以讀完整的數字。

例如,輸入為56 10 +時。

迴圈中第一次先讀入乙個字元c="5",

由於它是數字(isdigit),所以需要先putback,再用cin>>n讀,這樣n=56。如果不使用putback,由於5已經被讀過了,下面從第二個字元讀起,那麼n=6,這樣就錯了。

2.如果是操作符的情況下分情況討論

(1)如果輸入的操作符是『(』 就直接入操作符棧

(2)如果輸入的操作符的優先順序大於當前棧頂元素,則執行運算

運算的執行是將棧頂操作符出棧,將運算元棧的棧頂元素出棧,再將棧頂元素出棧,stop.top2  stoc.top stop.top1

將計算出的結果再入棧。

(3)如果輸入的操作符是『)』則依次執行運算,直到棧頂元素為『(』,停止運算,將操作符棧頂元素『(』出棧

例子中:(3+2*5)-3*(1+3)/4-2

執行以上運算

先將『#』入棧

(  入操作符棧

3入數字棧

+的優先順序大於(,直接入操作符棧

2入數字棧

*的優先順序大於+,直接入操作符棧

5入數字棧

發現)操作符,則執行運算操作,2*5=10,2,5出數字棧,10入數字棧,*出操作符棧,3+10=13,3,10出數字棧,13入數字棧,+出操作符棧,發現(操作符,結束運算,將(操作符出棧。此時數字棧內有13,操作符棧內有#

-的優先順序大於#,直接入操作符棧

3入數字棧

*入操作符棧

發現(操作符,直接入操作符棧

1入數字棧

+大於(,直接入操作符棧

3入數字棧

發現)操作符,執行運算操作,3,1出棧,+出棧,3+1=4,4入數字棧,發下)。。

然後處理剩下的操作符,按照運算,依次運算到棧頂元素是『#』,停止運算

以此類推,直到輸入完畢,則輸出數字棧棧頂元素。

自己編寫的**如下:

#include#include#include#include#include#includeusing namespace std;

stack sdop;

stack sdoc;

int compare(char c) //優先順序比較

} void compute() //做運算

sdop.push(z);

} int main()

//判斷是操作符

else if(cinch=='(') sdoc.push(cinch);

else if(cinch==')')

sdoc.pop();

} else

sdoc.push(cinch);}}

topch=sdoc.top();

while(topch!='#')

cout<

中綴表示式求值

中綴表示式用於計算乙個表示式,比如計算器 就是這樣實現的 這兒是用棧的資料結構來實現的。首先輸入乙個字串,表示乙個表示式,然後用乙個棧儲存數字,另外乙個棧儲存符號 如果當前運算子優先順序比棧頂元素優先順序高,則入棧,若當前運算子優先順序小於等於棧頂運算子優先順序,則從數字棧中彈出兩個元素,從符號棧中...

中綴表示式求值

表示式求值都需要2個棧。乙個是符號棧,另乙個是數字棧。拿上面的字尾式45 來說,咱們剛才將表示式從4 5轉換到45 的過程是咱們一眼就能看出來的,但是計算機不能像咱們這樣做,因為他不會。他只會從表示式的開頭,順序掃瞄表示式的每乙個字元,它不能像咱們一樣 一眼就 看 出來。計算機是如何轉換的呢?1.從...

中綴表示式求值

計算 calc.cpp 問題描述 小明在你的幫助下,破密了ferrari設的密碼門,正要往前走,突然又出現了乙個密碼門,門上有乙個算式,其中只有 0 9 求出的值就是密碼。小明數學學得不好,還需你幫他的忙。用整數除法 輸入 輸入檔案calc.in共1行,為乙個算式。輸出 輸出檔案calc.out共1...