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 細節不同 前者用...