實現一個計算器,這種題目很大一種可能是使用棧,但是除此之外,也有一種類似於狀態機的思想。
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;
}
}