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

2021-10-08 08:12:47 字數 1957 閱讀 3387

中綴表示式轉字尾表示式

思路:三個方法: ① 將中綴表示式轉換成 中綴表示式對應的 list ② 自定義運算子優先順序 ? 將中綴表示式對應的 list 轉換成 字尾表示式.

1.1 使用 list 更好的和 stack 配合,list 比 字串的遍歷更加靈活.

將中綴表示式對應的 list 轉換成 字尾表示式

2.1 需要兩個棧: 運算子棧 s1、儲存臨時結果棧(為了方便使用list代替stack) s2

2.2 遍歷 中綴list

2.3 判斷是否為數字、( 、) 、運算子

2.3.1 如果是數字: 直接壓入 s2

2.3.2 如果是 ( : 直接壓入 s1

2.3.3 如果是 ) : 將棧 s1 中 『(』 以上的運算子彈出,壓入 s2 ,然後消去 (

2.3.4 如果是運算子:

2.3.4.1 當前棧為空 或者 棧頂為 ( : 直接壓入 s1

2.3.4.2 當前運算子優先順序 大於 棧頂的運算子優先順序, 直接壓人 s1

2.3.4.3 當前運算子優先順序 小於 棧頂的優先順序, 將棧頂運算子彈出,壓入 s2。 重複上訴 2.3.4.1 和 2.3.4.2 的判斷。

2.4 中綴 list 遍歷完後,將 s1 中剩餘的運算子依次彈出,壓入到 s2 中.

2.5 如果 s2 使用的stack,還需要將結果逆序輸出.

* 將中綴表示式轉換成字尾表示式

*/@test

public

void

tosuffixexpression()

/** * 將 中綴表示式轉成對應的 list

*/public

static list

toinsuffixstringlist

(string str)

else

} list.

add(s);}

else

}return list;

}/**

* 將 中綴表示式對應的list 轉換成 字尾表示式

*/public

static list

getsuffixexpression

(list

list)

elseif(

"(".

equals

(c))

elseif(

")".

equals

(c))

// 然後再將 ( 消除

s1.pop();

}else

// 再將當前符號壓入 s1

// 或:

// 1. 當前運算子優先順序 大於 棧頂運算子

// 2. 當前棧頂為 (

s1.push

(c);}}

// 最後將s1中剩餘的按序彈出壓入到 s2 中

while

(!s1.

empty()

)// 如果s2是stack,還需要逆序結果

return s2;

}/**

* 運算子優先順序

*/static

class

operation

else

if(c.

equals

("-"))

else

if(c.

equals

("*"))

else

if(c.

equals

("/"))

else

return0;

}}

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

一 基礎知識 中綴表示式 人們常用的表示式就叫做中綴表示式,如a b c d 字尾表示式 又叫做逆波蘭表示式,由一名波蘭數學家提出,方便進棧操作 字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字...

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

優先順序 如果輸入運算子的優先順序低於或等於棧頂的操作符優先順序,則棧內元素進入輸入佇列,輸入運算子入棧。乙個簡單的例子 演算法示意圖,使用了3個空間。輸入用符號代替,如果輸入是乙個數字則直接進輸出佇列,即圖中 b d f h 如果輸入是運算子,則壓入操作符堆疊,即圖中 c e 但是,如果輸入運算子...

中綴表示式轉換成字尾表示式 棧

字尾表示式嚴格按照從左到右進行計算的模式,符合計算機執行方式,而中綴表示式需要計算機遇到符號後向後掃瞄一位,若為括號或優先順序更高的操作符還需要向後繼續掃瞄。設我們欲將中綴表示式 a b c d e f g轉換成字尾表示式,正確的答案為 abc de f g 當我們讀入運算元的時候,立即將其放入到輸...