[演算法練習及思路-程式設計師面試金典(Java解法)]No85計算器

葉落雨飄發表於2020-12-09

題號:no85

題目名:計算器

原題URL:https://leetcode-cn.com/problems/calculator-lcci/

題目描述

給定一個包含正整數、加(+)、減(-)、乘(*)、除(/)的算數表示式(括號除外),計算其結果。

表示式僅包含非負整數,+, - ,*,/ 四種運算子和空格 。 整數除法僅保留整數部分。

示例 1:

輸入: "3+2*2"
輸出: 7

示例 2:

輸入: " 3/2 "
輸出: 1

示例 3:

輸入: " 3+5 / 2 "
輸出: 5

限制

  • 你可以假設所給定的表示式都是有效的。
  • 不要使用內建的庫函式 eval

思路

1.用棧去解決

2.預設前面有個0 + ,如果是數字,就將這個數進行計算

3.如果是運算子,那麼就將這次運算子保留到下次,然後上次的運算子計算這次的結果

4.如果加就直接放進去,減放他的相反數,乘的話先出棧然後和對應的數相乘;如果除也是出棧,和現在計算的數相除,維持先乘除後加減的邏輯

5.最後將所有數出棧後相加

解題程式碼

class Solution {
    public int calculate(String s) {
        String str = s.trim();
        char[] chars = str.toCharArray();
        //計算器用棧的方式去解決
        Deque<Integer> stack = new ArrayDeque<>();
        int idx= 0;
        int temp1 = 0;
        char op = '+';
        //遍歷字串
        while(idx<chars.length) {
            char c = chars[idx];
            if(c ==' ') {
                idx++;
                continue;
            }
            //如果碰到的是數字,就先計算數字結果
            if(Character.isDigit(c)) {
                //如果是數字
                temp1=temp1*10+ c -'0';
                idx++;
            }
            //如果碰到的是運算子,或者到末尾了,直接執行操作
            if(!Character.isDigit(c)||idx == chars.length) {
                int pre = 0;
                switch (op) {
                    //加法,將已經算好的數直接存進去
                    case '+' :{
                        stack.addLast(temp1);
                        break;
                    }
                    case '-' :{
                        stack.addLast(-temp1);
                        break;
                    }
                    case '*' :{
                        pre = stack.removeLast();
                        stack.addLast(pre*temp1);
                        break;
                    }
                    case '/' :{
                        pre = stack.removeLast();
                        stack.addLast(pre/temp1);
                        break;
                    }
                }
                temp1 = 0;
                op = c;
                idx++;
            }
        }
        int res =0;
        while (!stack.isEmpty()) {
            res+= stack.removeLast();
        }
        return res;
    }
}

相關文章