逆波蘭式

來源:互聯網
上載者:User

 將一個普通的中序運算式轉換為逆波蘭運算式的一般演算法是:

  (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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.