中綴表示式轉換為字尾表示式

2021-06-14 15:36:26 字數 2249 閱讀 6326

今天我們課前談一談,要說點什麼好呢?

最近小甲魚發現,很多魚油在學習資料結構和演算法的時候積極性已經開始有點下降了。甚至很多朋友懷疑資料結構和演算法到底有沒有用?

實話說,在大廈的防震設計、消除疾病、防止水源枯竭這些實際問題中,很遺憾,資料結構和演算法幾乎起不到任何直接作用。。。。。。

那為什麼我們要學呢?

很簡單,它可以鍛鍊我們的「高階」思維!

何為「高階」思維?

這所謂的「高階」也是小甲魚自己發明的,演算法的重要性不用說大家都知道,乙個程式,特別是大型程式,優秀的演算法和架構跟一般的演算法和架構效率差別是千萬倍!

這就可以解釋為什麼國產的幾大應用都在前幾天相繼投入血本進行重構。

這就跟建高樓大廈要打好根基是乙個道理,很多人喜歡當「暴發戶」,根基沒打好就開始蓋房,但蓋到四五層的時候發現根基不穩,拆掉重蓋!

小甲魚上節課帶大家編寫了乙個逆波蘭計算器。

但是,我們人類確實是喜歡這樣的表示式:(1-2)*(4+5)

而不是這樣的:1 2 – 4 5 + *

所以,我們這節課的任務就是編寫乙個程式,將使用者輸入的中綴表示式轉換為字尾表示式,而作為課後作業的延生,要求大家動手寫乙個中綴表示式計算器!

那麼如何將「(1-2)*(4+5)」轉化為「1 2 – 4 5 + *」呢?

其實很簡單,利用棧的「記憶」吧,符號都推入棧即可。

我們大家很清楚我們將要進入看圖識字環節了!

為了使得問題變得更加複雜,我們把假想敵設為:1+(2-3)*4+10/5

no pic you say a j8……

首先遇到第乙個輸入是數字1,數字在字尾表示式中都是直接輸出,接著是符號「+」,入棧:

中綴表示式轉換為字尾表示式

第三個字元是「(」,依然是符號,入棧,接著是數字2,輸出,然後是符號「-」,入棧:

中綴表示式轉換為字尾表示式

接下來是數字3,輸出,緊跟著是「)」,此時,我們需要去匹配棧裡的「(」,然後再匹配前將棧頂資料依次出棧(這就好比括號裡優先執行的道理):

中綴表示式轉換為字尾表示式

緊接著是符號「*」,直接入棧:

中綴表示式轉換為字尾表示式

遇到數字4,輸出,之後是符號「+」,此時棧頂元素是符號「*」,按照先乘除後加減原理,此時棧頂的乘號優先順序比即將入棧的加好要大,所以出棧。

棧中第二個元素是加好,按理來說大家平起平坐,但是按照先到先來後到吃屎的原則,棧裡的加好呆得太久了,也要出棧透透氣。(同理如果棧裡還有其他操作符,也是出棧)

最後把剛剛吃屎的那個加好入棧,操作如下圖:

中綴表示式轉換為字尾表示式

緊接著數字10,輸出,最後是符號「/」,進棧:

中綴表示式轉換為字尾表示式

最後乙個數字5,輸出,所有的輸入處理完畢,但是棧中仍然有資料,所以將棧中符號依次出棧。

有些東西看上去很難,但事實上做起來會更加的麻煩,就像這道題,小甲魚要求大家務必經過自己的思考,再跟著小甲魚來打**,一定會有更大的收穫!

總結規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字則直接輸出,若是符號,則判斷其與棧頂符號的優先順序,是右括號或者優先順序低於棧頂符號,則棧頂元素依次出棧並輸出,直到遇到左括號或棧空才將吃屎的那個符號入棧。

#include #include #define stack_init_size 20

#define stackincrement 10

typedef char elemtype;

typedef struct

sqstack;

initstack(sqstack *s)

push(sqstack *s, elemtype e)

*(s->top) = e; // 存放資料

s->top++;

}pop(sqstack *s, elemtype *e)

int stacklen(sqstack s)

int main()

}if( ')' == c )

}else if( '+'==c || '-'==c )

else

else

}while( stacklen(s) && '('!=e );

push(&s, c);}}

else if( '*'==c || '/'==c || '('==c )

else if( '#'== c )

else

scanf("%c", &c);

}while( stacklen(s) )

return 0;

}

中綴表示式轉換為字尾表示式

字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...

中綴表示式轉換為字尾表示式

字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...

中綴表示式轉換為字尾表示式

字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...