將一個普通的中序運算式轉換為逆波蘭運算式的一般演算法是:
(1)首先構造一個運算子棧,此運算子在棧內遵循越往棧頂優先順序越高的原則。
(2)讀入一個用中綴表示的簡單算術運算式,為方便起見,設該簡單算術運算式的右端多加上了優先順序最低的特殊符號“#”。
(3)從左至右掃描該算術運算式,從第一個字元開始判斷,如果該字元是數字,則分析到該數字串的結束並將該數字串直接輸出。
(4)如果不是數字,該字元則是運算子,此時需比較優先關係。
做法如下:將該字元與運算子棧頂的運算子的優先關係相比較。如果,該字元優先關係高於此運算子棧頂的運算子,則將該運算子入棧。倘若不是的話,則將棧頂的運算子從棧中彈出,直到棧頂運算子的優先順序低於當前運算子,將該字元入棧。
(5)重複上述操作(3)-(4)直至掃描完整個簡單算術運算式,確定所有字元都得到正確處理,我們便可以將中綴式表示的簡單算術運算式轉化為逆波蘭表示的簡單算術運算式。
import java.util.HashMap;<br />import java.util.Map;<br />import java.util.Stack;</p><p>public class Main {<br />private final static Map<Character, Integer> SYMBO_LEVEL = new HashMap<Character, Integer>();</p><p>static {<br />SYMBO_LEVEL.put('#', 0);<br />SYMBO_LEVEL.put('^', 7);<br />SYMBO_LEVEL.put('*', 5);<br />SYMBO_LEVEL.put('/', 5);<br />SYMBO_LEVEL.put('%', 5);<br />SYMBO_LEVEL.put('+', 3);<br />SYMBO_LEVEL.put('-', 3);<br />SYMBO_LEVEL.put('(', 1);<br />SYMBO_LEVEL.put(')', 8);<br />}</p><p>private Stack<Character> symboStack = new Stack<Character>();<br />private Stack<Character> valueStack = new Stack<Character>();</p><p>public void clearStack() {<br />symboStack.clear();<br />symboStack.add('#');<br />valueStack.clear();<br />}</p><p>public boolean isSymbo(Character c) {<br />return SYMBO_LEVEL.containsKey(c);<br />}</p><p>public void getRPE(String expression) {<br />clearStack();</p><p>for (int i = 0; i < expression.length(); i++) {<br />Character c = expression.charAt(i);<br />if (isSymbo(c)) { // 運算子<br />if (c.equals('(')) {<br />symboStack.push(c);<br />} else if (c.equals(')')) {<br />Character tempC = symboStack.pop();<br />while (!tempC.equals('(')) {<br />valueStack.push(tempC);<br />tempC = symboStack.pop();<br />}<br />} else {<br />Character tempC = symboStack.peek();<br />int level = SYMBO_LEVEL.get(c);<br />int tempLevel = SYMBO_LEVEL.get(tempC);<br />while (tempLevel >= level) {<br />valueStack.push(symboStack.pop()); // out<br />tempLevel = SYMBO_LEVEL.get(symboStack.peek());<br />}<br />symboStack.push(c);<br />}<br />} else {<br />valueStack.push(c);<br />}<br />}</p><p>// 將剩餘的符號位加入到逆波蘭式中<br />int length = symboStack.size() - 1;<br />for (int i = 0; i < length; i++) {<br />valueStack.push(symboStack.pop());<br />}</p><p>System.out.println(valueStack);<br />}</p><p>public int counter(String expression) {<br />getRPE(expression);</p><p>Stack<Integer> result = new Stack<Integer>();<br />Stack<Character> tempResult = new Stack<Character>();<br />tempResult.push('#');<br />int size = valueStack.size();<br />for (int i = 0; i < size; i++) {<br />tempResult.add(valueStack.pop());<br />}</p><p>Character c = tempResult.pop();<br />while (c != '#') {<br />if (isNum(c)) {<br />result.push(Integer.valueOf(c + ""));<br />} else {<br />int right = result.pop();<br />int left = result.pop();<br />if (c.equals('+')) {<br />result.push(left + right);<br />} else if (c.equals('-')) {<br />result.push(left - right);<br />} else if (c.equals('*')) {<br />result.push(left * right);<br />} else {<br />result.push(left / right);<br />}<br />}<br />c = tempResult.pop();<br />}</p><p>return result.pop();<br />}</p><p>private boolean isNum(Character c) {<br />return c >= '0' && c <= '9';<br />}</p><p>/**<br /> * @param args<br /> */<br />public static void main(String[] args) {<br />// TODO Auto-generated method stub<br />Main m = new Main();<br />System.out.println(m.counter("5+2*(5*3+4*3-1)"));<br />// m.getRPE("5+2");<br />}</p><p>}<br />
結果為:
[5, 2, 5, 3, *, 4, 3, *, +, 1, -, *, +]
57