Java 字尾表示式實現計算器(逆波蘭計算器)
阿新 • • 發佈:2021-01-02
逆波蘭計算器的實現
- 輸入一個逆波蘭表示式(字尾表示式), 使用棧(Stack), 計算其結果
- 支援小括號和多位數整數, 因為這裡我們主要針對於資料結構, 因此計算器進行簡化, 只支援對整數的計算
- 思路分析
- 程式碼完成
package com.beyond.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class PolandNotation {
public static void main(String[] args) {
// 先定義一個逆波蘭表示式
// (3+4)*5-6 => 3 4 + 5 * 6 -
// 為了方便, 逆波蘭表示式 的數字和符號使用空格隔開
String suffixExpression = "3 4 + 5 * 6 -";
// 思路:
// 1. 先將 "3 4 + 5 * 6 -" => 放到 ArrayList中
// 2. 將 ArrayList 傳遞給一個方法, 遍歷ArrayList 配合 棧 完成計算
List<String> rpnList = getListString(suffixExpression) ;
System.out.println(rpnList);
System.out.println(calculate(rpnList));
}
// 將一個逆波蘭表示式, 依次將資料和運算子 放入 ArrayList 中
public static List<String> getListString(String suffixExpression){
// 將suffixExpression 分割
String split [] = suffixExpression.split(" ");
List<String> list = new ArrayList<String>();
for(String ele: split) {
list.add(ele);
}
return list;
}
// 完成對逆波蘭表示式的運算
/**
* 1. 從左到右掃描, 將3和4壓入堆疊;
* 2. 遇到 + 運算子, 因此彈出 4和3 (4 為棧頂元素,3為次棧頂元素), 計算 3+4 的值, 得7, 再將7 入棧
* 3. 將 5 入棧
* 4. 接下來是 * 運算子, 因此 彈出 5和7, 計算出 7*5 = 35, 將35 入棧
* 5. 將6入棧
* 6. 最後是 - 運算子, 計算出 35 -6 的值, 即29, 由此得出最終結果
*/
public static int calculate(List<String> ls) {
// 建立個棧, 一個棧即可
Stack<String> stack = new Stack<String>();
// 遍歷 ls
for(String item: ls) {
// 使用一個正則表示式來取出數
if (item.matches("\\d+")) { // 匹配的是多位數
// 入棧
stack.push(item);
}else {
// pop 出兩個數, 並運算, 再入棧
int num2 = Integer.parseInt(stack.pop());
int num1 = Integer.parseInt(stack.pop());
int res = 0;
if (item.equals("+")) {
res = num1 + num2;
}else if (item.equals("-")) {
res = num1 - num2;
}else if (item.equals("*")) {
res = num1 * num2;
}else if (item.equals("/")) {
res = num1 / num2;
}else {
throw new RuntimeException("運算子有誤!");
}
// 把 res 入棧
stack.push(String.valueOf(res)); // 轉成字串, 還可以 Integer.toString(res) 或者使用 +""
}
}
// 最後留在 stack 中的資料就是運算結果
return Integer.parseInt(stack.pop());
}
}