1. 程式人生 > 實用技巧 >力扣演算法:基本計算器Ⅱ

力扣演算法:基本計算器Ⅱ

原題連結: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(); }