鹹魚學資料結構與演算法 中綴表示式轉字首表示式

2021-10-16 12:54:34 字數 1688 閱讀 6146

目錄

一、中綴表示式轉字首表示式演算法介紹

二、中綴表示式轉字首表示式**實現

(1) 初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

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

(3) 遇到運算元時,將其壓入s2;

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

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

(4-2) 否則,若優先順序比棧頂運算子的較高或相等,也將運算子壓入s1;

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

(5) 遇到括號時:

(5-1) 如果是右括號「)」,則直接壓入s1;

(5-2) 如果是左括號「(」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到右括號為止,此時將這一對括號丟棄;

(6) 重複步驟(2)至(5),直到表示式的最左邊;

(7) 將s1中剩餘的運算子依次彈出並壓入s2;

(8) 依次彈出s2中的元素並輸出,結果即為中綴表示式對應的字首表示式。

//infixexperssion為中綴表示式

public static listinfixtoprefix(string infixexperssion)

// 如果掃瞄到是運算元,直接將結果加入到結果list中

// 如果是多位數的問題已經解決

if (isnum(infixexperssion.charat(index)))else

// 已經是最後一位數了,不需要看下一位了

}else

// 如果是運算子,根據運算子優先順序判斷運算子是否進入運算子棧

}else if(isoper(infixexperssion.charat(index)))else if(priority(oper)>priority(operstack.peek().charat(0)))else

// 如果是右括號,將右括號放入運算子棧中

}else if(infixexperssion.charat(index)==')') else if(infixexperssion.charat(index)=='(')

// 丟棄右括號

operstack.pop();

index--;}}

// 將運算子棧中的運算子彈到list中

while (!operstack.empty())

// 將結果反轉

collections.reverse(resultlist);

return resultlist;

}//比較優先順序

public static int priority(char ch)else if (ch=='*'||ch=='/')else

}//判斷是否為運算子

public static boolean isoper(char oper)else

}//判斷是否為數字

public static boolean isnum(char num)else

}

鹹魚學資料結構和演算法 中綴表示式計算機求值

目錄 一 中綴表示式計算機求值演算法介紹 二 中綴表示式計算機求值 實現 1.通過乙個 index 值 索引 來遍歷我們的表示式 2.如果我們 發現是乙個數字,就直接入數棧 3.如果發現 掃瞄到是乙個符號,就分如下情況 3.1 如果發現當前的符號棧為 空,就直接入棧 3.2 如果符號棧有操作符,就進...

資料結構 中綴表示式轉字尾表示式

話不多說上例子 1 2 3 4 5 1 2 3 4 5 中綴表示式轉字尾表示式思路分析 1.首先需要兩個棧運算子棧 s1和儲存中間結果的棧 s2 2.從左至右掃瞄中綴表示式 2.1當前為運算元,將其壓棧至s2 2.2當前為運算子 2.2.1如果s1為空或者棧頂運算子為左括號 則將此運算子直接入s1棧...

鹹魚學資料結構和演算法 字尾表示式計算機求值

目錄 一 字尾表示式計算機求值演算法介紹 二 字尾表示式計算機求值 實現 從左至右掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算 次頂元素 和 棧頂元素 並將結果入棧 重複上述過程直到表示式最右端,最後運算得出的值即為表示式的結果 例如 3 4 5...