對於計算機來說,字尾表示式更方便計算,但是對於我們來說,中綴表示式更方便理解。為了大家都方便,下面就聊聊如何把乙個中綴表示式借助**轉化成乙個字尾表示式。
在實現轉字尾表示式時,用棧結構儲存操作符,由於中間結構不用出棧,並且如果用棧結構儲存,那麼將出棧結果逆序才是我們要的字尾表示式,所以用list儲存即可,下面先來說說轉化過程的思路:
若當前元素是數字,直接入list;
若當前元素是左括號(,直接入stack;
若當前元素是右括號),將stack中的元素出棧,併入list中,直到遇到左括號停止,並將左括號出棧(這裡捨棄一對括號);
此時,當前元素是操作符,如果當前操作符的優先順序小於或者等於棧頂操作符優先順序,出棧並將出棧的操作符入list,再將當前操作符入棧;否則直接入棧。
**:
//把中綴表示式轉化成對應的字尾表示式
public class infixtosuffix
//把中綴表示式字串轉成對應的list
public static listinfixtolist(string str)else
list.add(s);
}}while (itosuffix(listlist)else if (item.equals("("))else if (item.equals(")"))
//去掉stack中的(
stack.pop();
}else
//stack.push(item);}}
//遍歷完list,還需將stack中剩餘元素加入ls中
while (stack.size()!= 0)
return ls;
}}class operation
return res;
}}
資料結構之中綴表示式轉字尾表示式
中綴表示式轉字尾表示式的基本規則 1.遇到運算元就直接輸出 2.遇到左括號就壓入棧中 3.遇到右括號就將棧中所有符號輸出且彈出 左括號只需要彈出不需要輸出 4.遇到操作符就與棧頂元素進行對比 當前操作符比棧頂操作符的優先順序大的話 就直接將當前操作符壓入棧中 當前操作符比棧頂操作符的優先順序小或者相...
資料結構之中綴表示式轉字尾表示式
初始化兩個棧 運算子棧s1和儲存中間結果的棧s2 從左至右掃瞄中綴表示式 遇到運算元時,將其壓s2 遇到運算子時,比較其與s1棧頂運算子的優先順序 1.如果s1為空,或棧頂運算子為左括號 則直接將此運算子入棧 2.否則,若優先順序比棧頂運算子的高,也將運算子壓入s1 3.否則,將s1棧頂的運算子彈出...
資料結構棧之中綴表示式轉字尾
對於乙個中綴表示式,假設a b a b 我們對它從左至右進行遍歷,當遇到運算元時直接輸出 當遇到操作符且棧為空時,將操作符壓入棧 當遇到左括號時,將其入棧 當遇到右括號時,將棧中左括號上面的元素依次出棧並輸出,最後將左括號出棧 但不輸出 當遇到操作符時 此時棧非空 當棧頂元素也為操作符且優先順序大於...