Leetcode[224] Basic Calculator
Implement a basic calculator to evaluate a simple expression string.
The expression string may contain open ( and closing parentheses ),
the plus +, minus sign - or * or /, 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 "1 + (2 - 3 * 4)" = -9;
Stack
复杂度
O(N), O(N)
思路
将字符串先转换成后缀表达式,再将其evaluate出来。
前后缀表达式的转换:
http://scriptasylum.com/tutor...
后缀表达式的evaluation:
http://scriptasylum.com/tutor...
代码
public int basicCalculator(String s) {
s = s.trim().replaceAll(" +", "");
Stack<Character> stack = new Stack<>();
StringBuilder builder = new StringBuilder();
char[] arr = s.toCharArray();
for(int i = 0; i < arr.length; i ++) {
if(arr[i] == '(') {
stack.push('(');
}
else if(arr[i] == ')') {
while(!stack.isEmpty() && stack.peek() != '(') {
builder.append(stack.pop());
}
// pop out the '('
stack.pop();
}
else if(Character.isDigit(arr[i])) {
int val = 0;
for(int j = i; j < arr.length && Character.isDigit(arr[j]); j ++) {
val *= 10;
val += arr[j] - '0';
}
builder.append(val);
i = j - 1;
}
else {
while(!stack.isEmpty() && rank(stack.peek()) >= rank(arr[j])) {
builder.append(stack.pop());
}
stack.push(arr[j]);
}
}
while(!stack.isEmpty()) {
builder.append(stack.pop());
}
return evaluate(builder.toString());
}
public int rank(Character ch) {
if(ch == '+' || ch == '-') return 1;
else if(ch == '*' || ch == '/') return 2;
// '('
return 0;
}
public int evaluate(String s) {
char[] arr = s.toCharArray();
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < arr.length; i ++) {
if(Character.isDigit(arr[i])) {
stack.push(arr[i] - '0');
}
else {
int op2 = stack.pop();
int op1 = stack.pop();
if(arr[i] == '+') {
stack.push(op1 + op2);
}
else if(arr[i] == '-') {
stack.push(op1 - op2);
}
else if(arr[i] == '*') {
stack.push(op1 * op2);
}
else {
stack.push(op1 / op2);
}
}
}
return stack.pop();
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。