Basic Calculator相關問題

實現一個計算器,這種題目很大一種可能是使用棧,但是除此之外,也有一種類似於狀態機的思想。

Basic Calculator 1.

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:
“3+2*2” = 7
” 3/2 ” = 1
” 3+5 / 2 ” = 5

題目的總體思路就是:記錄前一時刻的數和運算符,在遇到當前時刻的運算符決定前面如何計算。
我們可以利用一個變量sign來表示上一時刻是加法還是減法,number來表示前一個數。很明顯,當我們遇到一個+或者-的時候,那麼可以把前一時刻存儲的數number加或者減到最終結果上。如果我們當前遇到一個*或者/,就要向後尋找下一個數並與number先進行乘除法,最終結果存儲爲number在下一輪遍歷中作爲上一個值使用。這道題目不需要使用棧,但是需要保存前一時刻的狀態並進行更新。
因爲C++中有引用變量,爲了減少代碼的重複採用C++。但實際上引用變量降低了運行的效率,僅僅是適合觀看。

class Solution {
public:
    int calculate(string s) {
        int result = 0,sign = 1, number = 0;
        for (int i = 0;i<s.length();i++) {
            char cur = s.at(i);
            if (isdigit(cur)) {
            //每一次,我們尋找的number是前一時刻的數,在後面看到了新的運算符後才進行運算。
                number = cur - '0';
                findNextNumber(number, i, s);
            } else if (cur == '+') {
                result = result+ number*sign ;
                sign = 1;
            } else if (cur == '-') {
                result = result + number* sign ;
                sign = -1;
            } else if (cur == '*' || cur == '/') {
                int lastNumber = number;
                number = 0;
                findNextNumber(number, i, s);
                if (cur == '*') number = (lastNumber * number);
                else  number = (lastNumber / number);
            }
        }
        return result + sign * number;
    }

private:
    void findNextNumber(int &number, int &i,string s){
        while (i + 1 < s.length()) {
            char next = s.at(i + 1);
            if (isdigit(next)) {
                number = number * 10 + next - '0';
                i++;
            }else if (next == ' ') i++;
            else break;
        }
    }
};

Basic Calculator II

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:
“1 + 1” = 2
” 2-1 + 2 ” = 3
“(1+(4+5+2)-3)+(6+8)” = 23

當有括號的時候,實際上我們是一個括號一個括號內進行運算的,用result表示每個括號內的計算結果。
sign表示前一時刻標誌位,遇到+或者-進行對應的更新。
遇到左括號(表明開始了一個新的局部運算,初始化result,sign,並將前一時刻結果及運算符放入棧中。
遇到右括號)表明當前一個括號內計算完成,需要從棧中拿出前一部分進行相應計算。

public class Solution {
    public int calculate(String s) {
        int result = 0,sign = 1;
        Stack<Integer> stack = new Stack<>();
        for (int i = 0;i<s.length();i++) {
            char c = s.charAt(i);
            if (Character.isDigit(c)) {
                int number = c - '0';
                while (i + 1 < s.length()) {
                    char next = s.charAt(i + 1);
                    if (Character.isDigit(next)){
                        number = number * 10 + next - '0';
                        i++;
                    }else if (next == ' ') i++;
                    else break;
                }
                result += sign * number;
            } else if (c == '+') {
                sign = 1;
            } else if (c == '-') {
                sign = -1;
            } else if (c == '(') {
                stack.push(result);
                stack.push(sign);
                result = 0;
                sign = 1;
            } else if (c == ')') {
                result = result * stack.pop() + stack.pop();
            }
        }
        return result;
    }
}
發佈了57 篇原創文章 · 獲贊 21 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章