1. 程式人生 > 其它 >逆波蘭計算器實現

逆波蘭計算器實現

字首表示式又稱為波蘭表示式,字尾表示式又稱為逆波蘭表示式

實現過程

  1、輸入一個逆波蘭表示式(字尾表示式),使用棧(Stack),計算其結果

  2、支援小括號和多位數,本例簡化為支援對整數計算

  3、思路分析:

    還是以(3+4)*5-6為例,其對應字尾表示式為3 4 + 5 * 6 -

    1.從左到右掃描,將3和4壓入棧(4為棧頂元素,3為次頂元素),

    2.遇到+運算子,計算3+4d的值,為7並將7壓入棧;

    3.將5入棧

    4.遇到*運算子,彈出5和7,計算結果為35,將35壓入棧;

    5.將6入棧

    6.最後是-運算子,彈出35和6,計算出35-6得到最終結果29。

程式碼實現

package com.atxihua;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class PolandNotation {
    public static void main(String[] args) {
        //先定義給逆波蘭表示式
        //測試
        //說明為了方便,逆波蘭表示式的數字和符號使用空格隔開
        String suffixExpression="3 4 + 5 * 6 -";//29
        /*
* 思路 * 先將 suffixExpression 放到ArrayList中 * 將ArrayList傳遞給一個方法,遍歷ArrayList配合棧 完成計算 * */ List<String> list=getListString(suffixExpression); System.out.println("rpnList="+list); int res=calculate(list); System.out.println("計算的結果是:"+res); }
//將一個逆波蘭表示式,依次將資料和運算子放入到ArrayList中 public static List<String> getListString(String suffixExpression){ //將suffixExpression分隔,注意" "之間有空格 String[] split=suffixExpression.split(" "); List<String> list=new ArrayList<>(); for(String ele:split){ list.add(ele); } return list; } /* * 完成對逆波蘭表示式的運算 * 從左只右掃描,將3和4壓入堆疊 * 遇到+運算子,因此彈出4和3(4為棧頂元素,3為次頂元素),計算出3+4的值等於7,再將7入棧 * 將5入棧 * 接下來是*(乘)運算子,因此彈出5和7,計算得到結果35,再將35入棧 * 將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("-")){ //注意num2比num1先出棧,所以是num1-num2 res=num1-num2; }else if(item.equals("/")){ res=num1/num2; }else if(item.equals("*")){ res= num1*num2; }else { throw new RuntimeException("運算子有誤"); } //把res入棧 stack.push(""+res); } } //最後留在棧中的是計算結果 return Integer.parseInt(stack.pop()); } }

執行結果: