普通的計算方式,也叫中綴表達式。計算機識別及正確運用須要耗費大量的資源java
如:23+45*2-(8+2)數據結構
計算機想要正確計算出此時的結果須要十分複雜,更況且狀況十分多變。spa
逆波蘭式:又叫作後綴表達式,它能去除中綴表達式的括號。十分符合計算機的計算思惟,能極大提升效率code
表達式不能用字符串進行存儲,由於這將沒法分辨,應用集合(ArrayList,LinkedList存儲)blog
如:23 45 2 * 8 2 + - +資源
那麼中綴表達式是如何變成後綴表達式的呢?原則以下:字符串
1.首先把普通的表達式按照運算符分離出來放在一個集合E中,好比1+2*3 分離後集合裏的元素就是 1 + 2 * 3 五個元素get
2.再定義一個集合R(最好是字符串類型的集合,省得後面要轉類型),主要是用來存放逆波蘭表達式的,還有定義一個堆棧(存儲運算符用),最後從左到右遍歷集合E class
3.遍歷E的規則以下:test
3.1若是該元素是數字,直接把它添加到集合R中
3.2不然它確定是運算符,那麼再進行判斷
3.2.1若是該元素是左括號,或者當時棧爲空,那麼直接入棧
3.2.2若是該元素是右括號,則把棧內的運算符出棧並添加到集合R中,直到遇到第一個左括號結束(左括號也出棧但不添加到R)
3.2.3不然該元素是普通的運算符(也就是+-*/之類的),那麼用該運算符和棧內的運算符號比較優先級,若是該運算符的優先級比棧內的運算符
優先級高 或者 棧爲空,則直接入棧,不然把棧內的運算符出棧並添加到R中,再判斷下個棧內的運算符優先級,直到遇棧內的運
算符優先級<=該運算符或者棧爲空時再把該運算符入棧
3.3整個過程完成後,再把棧內的全部運算符出棧並添加到R中
成功獲得後綴表達式,但計算機又是如何經過後綴表達式計算出結果的呢?
這就須要運用到數據結構棧的特色
上式具體流程就是;
代碼以下;
import java.util.ArrayList; import java.util.ListIterator; import java.util.Scanner; import java.util.Stack; public class test { /** * 將字符串轉換爲中序表達式 */ public static ArrayList<String> toZhong(String s){ ArrayList<String> arrayList=new ArrayList();//存貯中綴表達式 for(int i=0;i<s.length();i++){ String str=""; if(s.charAt(i)<48||s.charAt(i)>57){//48:0,57:9 str=str+s.charAt(i); arrayList.add(str); } else{ while(i<s.length()&&s.charAt(i)>=48&&s.charAt(i)<=57){ str=str+s.charAt(i); i++; } arrayList.add(str); i--; } } return arrayList; } --------------------------------------------------------------------------------------- /* * 把中綴表達式轉成逆波蘭式 */ public static ArrayList<String> toNishi(ArrayList<String> list){ ArrayList<String> arr=new ArrayList();//用表存儲逆波蘭式 Stack<String> timeStack=new Stack();//臨時存儲操做符 for(String s:list){ if(s.matches("\\d+")){ arr.add(s); } else if(s.equals("(")){ timeStack.push(s); } else if(s.equals(")")){ while(!(timeStack.peek().equals("("))){ arr.add(timeStack.pop()); } } else{ while(timeStack.size()!=0&&getValue(s)<getValue(timeStack.peek())){ arr.add(timeStack.pop()); } timeStack.push(s); } } while(timeStack.size()!=0){ arr.add(timeStack.pop()); } return arr; } public static int getValue(String ss) { if (ss.equals("+")) { return 1; } else if (ss.equals("-")) { return 1; } else if (ss.equals("*")) { return 2; } else if (ss.equals("\\")) { return 2; } return 0; } ------------------------------------------------------------------------------------------ //計算逆波蘭式結果 public static int jisuan(ArrayList<String> arr){ Stack<Integer> jieguo=new Stack<Integer>(); for(String s:arr){ if(s.matches("\\d+")){ jieguo.push(Integer.parseInt(s)); } else if(jieguo.size()>=2){ Integer a=jieguo.pop(); Integer b=jieguo.pop(); if(s.equals("+")){ jieguo.push(b+a); } else if(s.equals("-")){ jieguo.push(b-a); } else if(s.equals("*")){ jieguo.push(b*a); } else if(s.equals("//")){ jieguo.push(b/a); } } } return jieguo.pop(); }