字尾表示式轉化為字首表示式 PASCAL

2025-01-26 01:15:17 字數 5514 閱讀 9270

1樓:網友

先建立二叉樹。

再按前序遍歷輸出。

2樓:網友

什麼意思?說明白點。

中綴表示式轉字尾表示式怎麼轉?

3樓:小小綠芽聊教育

中綴表示式a + b*c + d * e + f) *g,其轉換成字尾表示式則為a b c * d e * f + g *

轉換過程需要用到棧,具體過程如下:

1)如果遇到運算元,我們就直接將其輸出。

2)如果遇到操作符,則我們將其放入到棧中,遇到左括號時我們也將其放入棧中。

3)如果遇到乙個右括號,則將棧元素彈出,將彈出的操作符輸出直到遇到左括號為止。注意,左括號只彈出並不輸出。

4)如果遇到任何其他的操作符,如(「+等,從棧中彈出元素直到遇到發現更低優先順序的元素(或者棧為空)為止。彈出完這些元素後,才將遇到的操作符壓入到棧中。有一點需要注意,只有在遇到" )的情況下我們才彈出" (其他情況我們都不會彈出" (

5)如果我們讀到了輸入的末尾,則將棧中所有元素依次彈出。

中綴表示式如何轉換為前字尾表示式?

4樓:海天盛

1.中綴表示式字尾演算法:遇到運算元,直接輸出。

2.棧是空的,遇到操作符,直接推棧。

3.當遇到開括號時,按下它,如下圖所示。

4.當遇到右括號時,執行out操作並開始輸出out元素。直到彈出堆疊的元素是乙個開括號。

5.當遇到其他操作符時,彈出該操作符大於或等於堆疊頂部的所有優先順序元素,然後將該操作符推入堆疊。最後,將堆疊中的元素推出堆疊。

5樓:網友

1、中綴表示式變字尾的演算法:遇到運算元,直接輸出。

2、棧為空是,遇到運算子,直接入棧。

3、遇到左括號時,將其入棧。

4、遇到右括號時,執行出棧操作,並且開始將出棧的元素輸出。直到彈出棧的元素是左括號為止。

5、遇到其他運算子的時候,彈出所有優先順序大於等於該運算子棧頂元素,然後將該運算子入棧。最終將棧中的元素依次出棧。

6樓:

中綴轉字尾表示式:設計兩個棧,乙個是字元型的,存放運算子,用以將算數表示式變成無括號的表示式;另乙個是浮點型的,存放運算元,用以對無符號的表示式求值。要先假設運算子的優先順序:

首先將乙個左括號『(』進棧,作為棧底元素;接著從左到右對算數表示式進行掃瞄,每次讀乙個字元,若遇到左括號『(』則進棧; 若遇到的是運算元,則立即輸出; 若又遇到運算子,如果他的優先順序比棧頂元素的優先順序高的話,則直接進棧,否則輸出棧頂元素,直到新的棧頂元素的優先順序比他低的時候,將他壓棧; 若遇到的是右括號『)』則將棧頂的運算子輸出,知道棧頂的元素為『(』談後,左右括號互相抵消; 如果最終,我們要掃瞄的表示式結束,就將棧中的運算子全部輸出,消除棧底的左括號『(』

我也是剛學,資料結構上用到的,你看看對你有沒有幫助吧。

7樓:求求你啦幫忙

我可以幫個小忙,樹學過嗎?把字尾表示式換成中綴我會,把表示式換成樹的形式和順序;樹其實很簡單,看看就好了,用樹比較好理解。

8樓:網友

一箇中綴式到其他式子的轉換方法~~

這裡我給出一箇中綴表示式~

a+b*c-(d+e)

第一步:按照運算子的優先順序對所有的運算單位加括號~式子變成拉:((a+(b*c))-d+e))第二步:轉換字首與字尾表示式。

字首:把運算子號移動到對應的括號前面。

則變成拉:-(a *(bc)) de))把括號去掉:-+a*bc+de 字首式子出現字尾:把運算子號移動到對應的括號後面。

則變成拉:((a(bc)* de)+ 把括號去掉:abc*+de+- 字尾式子出現。

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

9樓:亞浩科技

數學裡面的公式就是中綴表示式,是我們生活中裡面常用的表示式,比如說 a*(b+c) ,中綴表示式可以用括號來調整優先順序。

運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不用考慮運算子的優先順序),如 a*(b+c) ,轉化為字尾表示式 即 a b + 3 *

從頭到尾讀取中綴表示式中的每個物件, 對不同物件按不同情況處理。

例如將中綴表示式 2 * 9 + 6 / 3 - 5) +4 轉化為字尾表示式 2 9 6 3 / 5 - 4 + 轉換步驟如下:

中綴表示式轉字尾表示式是什麼?

10樓:由由講百科

中綴表示式轉字尾表示式規則:1、初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

2、從左至右掃瞄中綴表示式;

3、遇到運算元時,將其壓s2;

4、遇到運算子時,比較其與s1棧頂運算子的優先順序:

1)如果s1為空,或棧頂運算子為左括號「(」則直接將此運算子入棧;

2)否則,若優先順序比棧頂運算子的高,也將運算子壓入s1;

3)否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(與s1中新的棧頂運算子相比較;

5、遇到括號時:

1)如果是左括號"("則直接壓入s1 ;

2)如果是右括號")"則依次彈出s1棧頂的運算子,並壓入s2,直到遇到左括號為止,此時將這一對括號丟棄,重複步驟2至5,直到表示式的最右邊;

6、將s1中剩餘的運算子依次彈出並壓入s2;

7、依次彈出s2中的元素並輸出,結果的逆序即為中綴表示式對應的字尾表示式。

字尾表示式的轉換

11樓:木小木

計算機實現轉換:

將中綴表示式轉換為字尾表示式的演算法思想:

開始掃瞄;數字時,加入字尾表示式;

運算子:a. 若為 '(入棧;

b. 若為 ')則依次把棧中的的運算子加入字尾表示式中,直到出現'('從棧中刪除'('

c. 若為 除括號外的其他運算碧歲符, 當其優先順序高於除'('以外的棧頂運算子時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,直到乙個比它優先順序低的或者遇到了乙個左括號為止。

當掃瞄的中綴表示式結束時,棧中的的所有運算子出棧;

人工實現轉換。

這裡我給出一箇中綴表示式:a+b*c-(d+e)

第一步:按照運算子的優先順序對所有的運算單位加括號:式子變成了:((a+(b*c))-d+e))

第二步:轉換字首與字尾表示式。

字首:把運算子號移動到對應的括號前面。

則變成了:-(a *(bc)) de))

把括號去掉:-+a*bc+de 字首式子出現。

字尾:把運算子號移動到對應的括號後面。

則變成了:((a(bc)* de)+

把括號去掉:abc*+de+- 字尾式子出現。

發現沒有,字首式,字尾式是不需要用括號來進行優先順序的確定的。如表示式:3+(2-5)*6/3

字尾表示式 棧。

_用於隔開字尾表示式與棧)

另外乙個人認為正確的轉換方法:

遍歷中綴表示式的每個節點,如果:

1、 該節點為運算元:

直接拷貝進入字尾表示式。

2、 該節點是運算子,分以下幾種情況:

a、 為「(」運算子:

壓入臨時堆疊中。

b、 為「)」運算子:

不斷地彈出臨時堆疊頂部運算子直到頂部的運算子是「(」為止。並把彈出的運算子都新增到字尾表示式中。

c、 為其他運算子,有以下步驟進行:

比較該運算子與臨時棧棧頂指標的運算子的優先順序,如果臨時棧棧頂指標的優先順序大於等於該運算子的優先順序,彈出並添鉛慧乎加到字尾表示式中,反覆執行前面的比較工作,直到遇到乙個棧頂指標的優先順序低於該運算子的優先順序,停止彈出新增並把該運算子壓入棧中。

此時的比較過程如果出現棧頂的指標為『(』則停止迴圈並把該運算子壓入棧中,注意:『(不要彈出來。

遍歷完中綴槐悉表示式之後,檢查臨時棧,如果還有運算子,則全部彈出,並新增到字尾表示式中。

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

12樓:匿名使用者

1. 初始化一空棧,用來對符號進出棧使用。

2. 第乙個字元是數字9,輸出9,後面是符號「+」進棧。

3. 第三個字元是「(」依然是符號,因其只是左括號,還未配對,故進棧。

4. 第四個字元是數字3,輸出,總表示式為9 3,接著是「-」進棧。

5. 接下來是數字1,輸出,總表示式為9 3 1,後面是符號「)」此時,我們需要去匹配此前的「(」所以棧頂依次出棧,並輸出,直到「(」出棧為止。此時左括號上方只有「-」因此輸出「-」總的輸出表示式為9 3 1 -

6. 接著是數字3,輸出,總的表示式為9 3 1 - 3 。緊接著是符號「*」因為此時的棧頂符號為「+」號,優先順序低於「*」因此不輸出,進棧。

7. 之後是符號「+」此時當前棧頂元素比這個「+」的優先順序高,因此棧中元素出棧並輸出(沒有比「+」號更低的優先順序,所以全部出棧),總輸出表示式為 9 3 1 - 3 * 然後將當前這個符號「+」進棧。

也就是說,前6張圖的棧底的「+」是指中綴表示式中開頭的9後面那個「+」而下圖中的棧底(也是棧頂)的「+」是指「9+(3-1)*3+」中的最後乙個「+」

8. 緊接著數字10,輸出,總表示式變為9 3 1-3 * 10。

9. 最後乙個數字2,輸出,總的表示式為 9 3 1-3*+ 10 2

10. 因已經到最後,所以將棧中符號全部出棧並輸出。最終輸出的字尾表示式結果為 9 3 1-3*+ 10 2/+

從剛才的推導中你會發現,要想讓計算機具有處理我們通常的標準(中綴)表示式的能力,最重要的就是兩步:

將中綴表示式轉化為字尾表示式(棧用來進出運算的符號)。

將字尾表示式進行運算得出結果(棧用來進出運算的數字)。

整個過程,都充分利用了找的後進先出特性來處理,理解好它其實也就理解好了棧這個資料結構。

13樓:陽萱函梓玥

從演算法來說,要考慮中綴的運算子優先順序,括號等,可以使用簡單語法制導翻譯,去專看編譯原理書屬吧,從資料結構來說,可以使用二元樹和棧。使用二元樹就是先建立表示式的樹,然後後根遍歷即可。難點在建立樹。

使用棧的演算法也很多,說個好想的。假設表示式的字元來自輸入流in,建立棧a存放運算子,b存放結果,從in讀入乙個運算元壓進b,讀入乙個運算子壓進a,如此反覆。

1.讀入乙個元素e

2.如果e是運算元或者(,壓入b,跳轉到1

3.如果e是運算子(不包含括號),跳轉到。

4.如果e是),跳轉到。

5.如果e是eof,即輸入流結束,反覆彈出a棧頂壓入b,直到a為空,演算法結束,b從棧底到棧頂的符號即為字尾表示式(需要把b翻個個兒^_^

判斷a的棧定符號t,如果t不為(,且優先順序大於等於e,則彈出t壓入b,跳轉到4,如果t為空,即棧中為空,或其他情況直接把e壓入a,跳轉到1

彈出a的棧頂壓入到b,如此反覆直到彈出的符號為(,(和)不要壓入b,跳轉到1

這是我臨時想的,可能還有bug,或描述不清的地方,如果上網搜的話應該有很多源**的,如果學過編譯原理的話還可以有更好的演算法,這個演算法沒考慮容錯性。

pascal 字尾表示式轉中綴表示式 20分急求

program p1293 const maxl 1000000 type node record ch char l,r longint end var s ansistring list array 1.maxl of node t longint function getlevel x cha...

三元運算子表示式1?表示式2表示式3中,表示式

c 三元運算子是一個有返回值的表示式,所以不能執行無返回值語句,並且 表示式1 表示式2 表示式3 中,表示式2和表示式3的資料型別必須相同三元運算子 表示式1?表示式2 表示式3 中,表示式 三元運算子 表示式1?表示式2 表示式3 中,表示式2和表示式3能不能是一段 讓程式執行一個功能?c in...

化學表示式和反應表示式有什麼區別

化學表示式是單獨的,如化學式,離子符號,元素符號等,而反應表示式則是表示反應過程的式子,有文字表達或化學式表達,這是我的理解,供參考,化學方程式與符號表示式有什麼區別 1 要求不同 前者需要根據實際情況來配平,可以反映一個客觀事實 後者不用在表示式的基礎上進行配平,只是形式而已。2 細節不同 前者用...