棧實現字尾表示式計算
阿新 • • 發佈:2020-10-11
- 要求: 輸入一個逆波蘭表示式(字尾表示式),使用棧計算結果
- 這裡簡化,這對整數進行計算
思路分析
- 例如:(3+4)x5-6 對應的字尾表示式就是3 4 + 5 x 6 -,針對字尾表示式求值步驟如下:
- 從左至右掃描,將3和4壓入棧中;
- 遇到+運算子,因此彈出4和3(4為棧頂元素,3為次頂元素),計算出3+4的值7,再將7入棧;
- 繼續掃描,將5入棧;
- 接下來就是x運算子,因此彈出5和7,計算7x5 = 35,將35入棧
- 將6入棧;
- 最後是 - 運算子,計算35-6 = 29的值.
程式碼實現
public class PolandNotation { public static void main(String[] args) { String suffixExpression = "30 4 + 5 * 6 -"; //將字尾表示式儲存到ArrayList中 List<String> list = getListString(suffixExpression); //初始化一個棧 Stack<String> stack = new Stack<>(); //遍歷字尾表示式陣列 for (String s : list) { if (s.matches("\\d+")){ stack.push(s); }else { //出站兩個元素 int num1 = Integer.parseInt(stack.pop()); int num2 = Integer.parseInt(stack.pop()); //計算兩個數 int res = calculate(num1,num2,s); //將返回值壓棧 stack.push(""+res); } } System.out.printf("計算結果為:%d\n",Integer.parseInt(stack.pop())); } /** * * @param num1 先出棧的數 * @param num2 後出棧的數 * @param s 操作符 * @return 但會兩個數運算後的結果 */ private static int calculate(int num1, int num2, String s) { int res = 0; switch (s){ case "+": res = num2 + num1; break; case "-": res = num2 - num1; break; case "*": res = num2 * num1; break; case "/": res = num2 / num1; break; default: break; } return res; } /** * * @param suffixExpression 字尾表示式 * @return 返回轉換後的list陣列 */ private static List<String> getListString(String suffixExpression) { List<String> list = new ArrayList<>(); String[] s = suffixExpression.split(" "); for (String s1 : s) { list.add(s1); } return list; } }