標籤:
思路:
1 將運算式轉換成尾碼運算式
2 利用棧計算尾碼運算式
/** * 計算數值 * @param text * @return */ public static int count(String text) { Queue<String> queue=changeToPostOrder(text); Stack<Integer> stack=new Stack<>(); int result=0; while(!queue.isEmpty()) { String t=queue.poll(); if(t.length()>1)//數字 { stack.push(Integer.parseInt(t)); } else if(t.length()==1) { if(isYunsuanfu(t)) { char c=t.charAt(0); int ri=stack.pop(); int li=stack.pop(); switch (c) { case ‘+‘: result=li+ri; stack.push(result); break; case ‘-‘: result=li-ri; stack.push(result); break; case ‘*‘: result=li*ri; stack.push(result); break; case ‘/‘: result=li/ri; stack.push(result); break; default: break; } } else { stack.push(Integer.parseInt(t)); } } } return stack.empty()?0:stack.pop(); } //change to post order /** * 遇到數字直接輸出,遇到符號,假如是高於棧頂優先順序如乘除就直接壓棧, * 假如是低於或等於棧頂優先順序或者是右括弧直接輸出棧頂直到左括弧,再壓棧 * @param text * @return */ public static Queue<String> changeToPostOrder(String text) { Queue<String> queue=new LinkedList<>(); Stack<Character> stack=new Stack<>(); StringBuilder temp=new StringBuilder(); int len=text.length(); for(int i=0;i<len;i++) { char c=text.charAt(i); if (isNumber(c)) { temp.append(c); if(i==len-1) { queue.offer(temp.toString()); } }else { //如果是右括弧 直接輸出直到左括弧 if(temp.length()!=0) { queue.offer(temp.toString()); temp.delete(0, temp.length()); } if(c==‘)‘) { while(stack.peek()!=‘(‘) { queue.offer(stack.pop()+""); } //彈出左括弧 stack.pop(); continue; } //如果棧為空白直接壓棧 if(stack.empty() || c==‘(‘) { stack.push(c); continue; } //優先順序比較 高優先順序 壓棧 while(!stack.empty() && !isHigher(c, stack.peek())) { queue.offer(stack.pop()+""); } stack.push(c); } } while(!stack.empty()) { queue.offer(stack.pop()+""); } return queue; } public static boolean isNumber(char c) { return c>=‘0‘ && c<=‘9‘; } public static boolean isYunsuanfu(String s) { return s.equals("*") || s.equals("/") || s.equals("+") || s.equals("-"); } public static boolean isHigher(char c,char cmp) { return priority(c)>priority(cmp); } public static int priority(char c) { int p=0; switch (c) { case ‘*‘: p=2; break; case ‘/‘: p=2; break; case ‘+‘: p=1; break; case ‘-‘: p=1; break; default: break; } return p; }
程式很羅嗦,有空再寫一遍!
簡單四則運算運算式的java實現