您的位置:首页 > 其它

LeetCode Basic Calculator II(加减乘除计算器)

2016-07-28 16:33 288 查看
与 


LeetCode Basic Calculator(用栈计算表达式的值)相似

代码如下:
public class Solution
{
private int cal(int num1, int num2, char op)
{
switch(op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
case '*':
return num1 * num2;
case '/':
return num1 / num2;
default:
return 0;
}
}

public int calculate(String s)
{
String str = s.trim();
Stack<Integer> stackInt = new Stack<Integer>();
Stack<Character> stackChar = new Stack<Character>();

Map<Character, Integer> map = new HashMap<Character, Integer>();
map.put('(', 0); map.put('+', 1); map.put('-', 1); map.put('*', 2); map.put('/', 2); map.put(')', 3);

for (int i = 0; i < str.length(); i++)
{
if (Character.isSpaceChar(str.charAt(i))) {
continue;
}

//为数字,将数据提取出来
if (Character.isDigit(str.charAt(i))) {
int sum = 0;
int j = i;
for (; j < str.length(); j++)
{
if (Character.isDigit(str.charAt(j))) {
sum = sum * 10 + (char)(str.charAt(j) - '0');
} else {
break;
}
}
i = j - 1;
stackInt.add(sum);
} else {
//为运行符,如果栈为空,直接入栈
if (stackChar.isEmpty()) {
stackChar.add(str.charAt(i));
continue;
}

//为),则从栈中到运算符,直到遇到(
if (str.charAt(i) == ')') {
while (!stackChar.isEmpty() && stackChar.peek() != '(') {
int num2 = stackInt.pop();
int num1 = stackInt.pop();
char op = stackChar.pop();
int num = cal(num1, num2, op);
stackInt.push(num);
}

if (stackChar.peek() == '(') stackChar.pop();
} else {
//如果当前运行符优先级大于栈顶运行符优先级,直接入栈
if (str.charAt(i) != '(' && map.get(str.charAt(i)) > map.get(stackChar.peek())) {
stackChar.add(str.charAt(i));
} else {
//否则出栈,直到当前运行符优先级大于栈顶运行符优先级
while (!stackChar.isEmpty() && str.charAt(i) != '(' && map.get(str.charAt(i)) <= map.get(stackChar.peek())) {
int num2 = stackInt.pop();
int num1 = stackInt.pop();
char op = stackChar.pop();
int num = cal(num1, num2, op);
stackInt.push(num);
}

stackChar.add(str.charAt(i));
}
}

}
}

while (!stackChar.isEmpty()) {
int num2 = stackInt.pop();
int num1 = stackInt.pop();
char op = stackChar.pop();
int num = cal(num1, num2, op);
stackInt.push(num);
}

return stackInt.pop();

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: