力扣演算法:基本計算器Ⅱ
阿新 • • 發佈:2020-09-18
原題連結:https://leetcode-cn.com/problems/basic-calculator-ii
實現一個基本的計算器來計算一個簡單的字串表示式的值。
字串表示式僅包含非負整數,+, - ,*,/ 四種運算子和空格。 整數除法僅保留整數部分。
示例1:
輸入: "3+2*2"
輸出: 7
示例 2:
輸入: " 3/2 "
輸出: 1
示例 3:
輸入: " 3+5 / 2 "
輸出: 5
說明:
你可以假設所給定的表示式都是有效的。
請不要使用內建的庫函式 eval。
解題思路:首先根絕已有中綴表示式轉換為字尾表示式,之後再根據字尾表示式求值即可。
1.轉化為字尾表示式
首先準備一個棧用來儲存字元,另一個連結串列儲存字尾表示式。遇到數字直接放到表示式中,遇到字元的時候,如果棧空則入棧,不空的話和棧頂比較,將大於等於該字元的內容出棧並存到表示式中。
2.字尾表示式求值
這個比較容易,數字入棧,遇到字元計算即可。
原始碼如下:
public int calculate(String s) { LinkedList<String> houzhui = new LinkedList<>(); //字尾表示式棧 Stack<Character> charStack = new Stack<>(); int start = 0; for(int i=0; i<s.length();i++) { char c = s.charAt(i);if (c=='+'||c=='-'||c=='*'||c=='/') { houzhui.add(s.substring(start,i).trim()); start=i+1; if(!charStack.isEmpty()&&(c=='*'||c=='/')){ while(!charStack.isEmpty()&&(charStack.peek()=='*'||charStack.peek()=='/')) houzhui.add(charStack.pop().toString()); }if(!charStack.isEmpty()&&(c=='+'||c=='-')){ while (!charStack.isEmpty()) houzhui.add(charStack.pop().toString()); } charStack.add(c); } } houzhui.add(s.substring(start,s.length()).trim()); while (charStack.size() > 0) { houzhui.add(charStack.pop().toString()); } //字尾表示式生成完畢 Stack<Integer> numStack = new Stack<>(); while (houzhui.size()>0){ if(houzhui.peekFirst().equals("+")){ int t2 =numStack.pop(); int t1 =numStack.pop(); numStack.add(t1+t2); houzhui.pollFirst(); } else if(houzhui.peekFirst().equals("-")){ int t2 =numStack.pop(); int t1 =numStack.pop(); System.out.println(t1+" "+t2); numStack.add(t1-t2); houzhui.pollFirst(); } else if(houzhui.peekFirst().equals("*")){ int t2 =numStack.pop(); int t1 =numStack.pop(); numStack.add(t1*t2); houzhui.pollFirst(); } else if(houzhui.peekFirst().equals("/")){ int t2 =numStack.pop(); int t1 =numStack.pop(); numStack.add(t1/t2); houzhui.pollFirst(); }else { numStack.add(Integer.parseInt(houzhui.pollFirst())); } } return numStack.peek(); }