LeetCode:227. 基本計算器 II [Java實現]
阿新 • • 發佈:2018-11-20
實現一個基本的計算器來計算一個簡單的字串表示式的值。
字串表示式僅包含非負整數,+, - ,*,/ 四種運算子和空格 。 整數除法僅保留整數部分。
示例 1:
輸入: “3+2*2”
輸出: 7
示例 2:
輸入: ” 3/2 ”
輸出: 1
示例 3:
輸入: ” 3+5 / 2 ”
輸出: 5
這是一個典型的棧的應用。上程式碼
s = s.replaceAll(" ", "");
//if(!s.contains("+") &&!s.contains("-")&&!s.contains("*")&&!s.contains("+")){}
char[] chars = s.toCharArray();
int res = 0;
Map<Character, Integer> tool = new HashMap<>();
tool.put('+', 1);
tool.put('-', 1);
tool.put('*', 2);
tool.put('/', 2);
Stack<Integer> numbers = new Stack<>();
Stack<Character> signs = new Stack<>();
int pos = 0;
while (pos == 0 || !numbers.isEmpty()) {
if (pos < chars.length && chars[pos] <= '9' && chars[pos] >= '0') {
int num = 0;
while (pos < chars.length && chars[pos] <= '9' && chars[pos] >= '0' ) {
num = (num * 10 + chars[pos] - '0');
pos++;
}
if (pos != chars.length)
pos--;
numbers.push(num);
} else {
while (signs.size() != 0 && (pos == chars.length || tool.get(chars[pos]) <= tool.get(signs.peek()))) {
char sign = signs.pop();
int r = numbers.pop();
int l = numbers.pop();
res = caculate(l, r, sign);
numbers.push(res);
}
if (pos != chars.length)
signs.push(chars[pos]);
}
if (numbers.size() == 1 && signs.isEmpty() && pos == chars.length) break;
if (pos != chars.length)
pos++;
}
return numbers.pop();
}
private int caculate(int l, int r, char sign) {
if (sign == '+')
return l + r;
else if (sign == '-')
return l - r;
else if (sign == '*')
return l * r;
else
return l / r;
}