题意:给出一个计算表达式,只包含 +,-,(,),求计算结果
思路:用栈来实现
代码如下:
public class Solution
{
private int cal(int num1, int num2, char op)
{
switch(op) {
case '+':
return num1 + num2;
case '-':
return num1 - num2;
default:
return 0;
}
}
public int calculate(String s)
{
String str = s.trim();
Stack stackInt = new Stack();
Stack stackChar = new Stack();
Map map = new HashMap();
map.put('(', 0); map.put('+', 1); map.put('-', 1); map.put(')', 2);
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();
}
}