目錄
一、中綴表示式轉字首表示式演算法介紹
二、中綴表示式轉字首表示式**實現
(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...