1. 程式人生 > 其它 >Java 字尾表示式實現計算器(逆波蘭計算器)

Java 字尾表示式實現計算器(逆波蘭計算器)

技術標籤:資料結構資料結構

逆波蘭計算器的實現

  1. 輸入一個逆波蘭表示式(字尾表示式), 使用棧(Stack), 計算其結果
  2. 支援小括號和多位數整數, 因為這裡我們主要針對於資料結構, 因此計算器進行簡化, 只支援對整數的計算
  3. 思路分析
  4. 程式碼完成
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()); } }

在這裡插入圖片描述