1.题目
https://leetcode.com/problems/basic-calculator/?tab=Description
题目的意思是,实现一个基本的计算器来评估一个简单的表达式字符串,字符串可以包括左括号和右括号,加号和减号,不包括非负整数和空格。
2.算法
我们定义一个当前的运算结果res,并定义当前运算结果后的符号digit,当我们遇到(时,res和digit放入栈中,当遇到)时计算结果并放入栈中
每当有一个()就会出现一个res,栈主要存储上一级的结果和结果后的符号
不带括号的计算如下
public static int calculate(String s)
{
if (s == null || s.length() == 0)
{
return 0;
}
int res = 0;
int sign = 1;
for (int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
if (Character.isDigit(c))
{
int cur = c - '0';
while (i + 1 < s.length() && Character.isDigit(s.charAt(i+1)))
{
cur = cur * 10 + s.charAt(i+1) - '0';
}
res += cur * sign;
}
else if (c == '-')
{
sign = -1;
}
else
{
sign = 1;
}
}
return res;
}
带括号的计算如下
public static int calculate(String s)
{
if (s == null || s.length() == 0)
{
return 0;
}
int res = 0;
int sign = 1;
LinkedList<Integer> stack = new LinkedList<>();
for (int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
if (Character.isDigit(c))
{
int cur = c - '0';
while (i + 1 < s.length() && Character.isDigit(s.charAt(i+1)))
{
cur = cur * 10 + s.charAt(i+1) - '0';
}
res += cur * sign;
}
else if (c == '-')
{
sign = -1;
}
else if (c == '+')
{
sign = 1;
}
else if (c == '(')
{
stack.push(res);
res = 0;
stack.push(sign);
sign = 1;
}
else if (c == ')')
{
res = stack.pop() * res + stack.pop();
}
}
return res;
}