逆波蘭計算器實現
阿新 • • 發佈:2021-12-23
字首表示式又稱為波蘭表示式,字尾表示式又稱為逆波蘭表示式
實現過程
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()); } }
執行結果: