中綴表示式轉字尾表示式
我們把平時所用的標準四則運算表示式、即"9+ (3一1) x3+10=2』叫做中綴表示式。因為所有的運算符號都在兩數字的中i}}j ,現在我們的問題就是中綴到字尾的轉化目中綴喪達式}5}+(3一}] x 3+1}=2」轉化為字尾表示式「931一3*+1} 2/十u+ o規則:從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低寸幾伐頂符號(乘除優先加減)則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。
1.初始化一空棧,用來對符號進出棧使用。如圖 496 的左圖所示。
2.第乙個字元是數字9,輸出9,後面是符一號「+」,進棧。如圖 496 的右圖所示。
3.第三個字元是「(」、依然是符號,因其只是左括號,還未配對,故進棧,如圖497 的左圖所示、
4.第四個字元是數字3、輸出,總表示式為9 3,接著是「一」,進棧。如圖 497 的右圖所示。2.第乙個字元是數字9,
5.接下來是數字1,輸出,總表示式為 931 後面是符號「)」,此時,我們需要去匹配此前的 「(」所以棧頂依次出棧,並輸出,直到 「(」出棧為止。此時左括號上方只有「-」,所以輸出 - 、總的輸出表示式為 931 - 、如圖 498的作圖所示、
6.接著是數字3,輸出,總的表示式為 931 - 3、緊接著是符號 「x」、因為此時的棧頂符號為 「+」,優先順序低於 「x」、因此不輸出,「*」出棧、如圖 498的右圖所示、
7.之後是符號「+」,此時當前棧頂元素"*",比這個「+」的優先順序高,因此棧中元素出棧並輸出(沒有比「+」號更低的優先順序,所以全部出棧),總輸出表示式為9 3 1-3*+。然後將當前這個符號「+』』進棧。也就是說,前6張圖的棧底的「+」是指中綴表示式中開頭的9後面那個「十」,而圖 499 左圖中的棧底(也是棧頂)的「+」是指「9+ (3一1) x3+」中的最後乙個「+ n 4
8.緊接著數字10,輸出,總表示式變為93i一3*+1d。後是符號「-'r y所以7」進棧。如圖 499 的右圖所示。
9.最後乙個數字2,輸出,總的表示式為931~3*+1q 20如圖 49 10 的左圖所示。
10.因已經到最後,所以將棧中符號全部出棧並輸出。最終輸出的字尾表示式結果為931一3*+1}2j+。如圖 49 10 的右圖所示。
從剛才的推導中你會發現,要想讓計算機具有處理我們通常的標準(中綴)表示式的能力,最重要的就是兩步:
1.將中綴表示式轉化為字尾表示式(棧用來進出運算的符號)。
2將字尾表示式進行運算得出結果(伐用來進出運算的數字)。
整個過程,都充分利用了棧的後進先出特性來處理,理解好它其實也就理解好了棧這個資料結構。
好了,休息一下,一會兒我們繼續,接下來會講佇列、
《大話資料結構》
函式的漸進增長 我們現在來判斷一下,兩個演算法a和b哪個更好。假設兩個演算法的輸入規模都是n,演算法a要做2n 3次操作,你可以理解為先有乙個n次的迴圈,執行完成後,再有乙個n次迴圈,最後有三次賦值或運算,共2n 3次操作。演算法b要做3n 1次操作,你覺得它們誰更快呢 準確來說,答案是不一定的 當...
《大話資料結構》
常見的時間複雜度 常見的時間複雜度如下圖所示 常用的時間複雜度所耗費的時間從小到大依次是 o 1 o logn o n o nlogn o n o n 三次方 o 2 n次方 o n!o n n次方 我們前面已經談到了 o 1 常數階 o logn 對數階 o n 線性階 o n 平方階等,至於o ...
《大話資料結構》
線性表 線性表,從某種就能感覺到,是具有像線一樣的性質的表。在廣場上,有很多人分散在各處,當中有些是小朋友,可也有很多大人,甚至還有不少寵物,這些小朋友的資料對整個廣場人群來說,不能算是線性表的結果。但像剛才提到的那樣,乙個班級的小朋友,乙個跟著乙個排著隊,有乙個打頭,有乙個收尾,當中的小朋友,每乙...