题目描述:
Implement a basic calculator to evaluate a simple expression string.The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, 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)相当于(1+(2+3))),再由最小的括号
向外一个括号一个括号的算出最终结果。
实例:1+((2-3)+(4+5))
public class Basic_Calculator {
//判断该字符是否为数字
public static boolean isInteger(char chr)
{
if(chr-'0'>=0&&chr-'0'<=9)
return true;
return false;
}
//对于字符运算符的运算处理
public static int Operating(int a,int b,char chr)
{
int num = 0;
if(chr=='+')
{
num = a+b;
}
if(chr=='-')
{
num = a-b;
}
return num;
}
public static int calculate(String s)
{
//存放各括号内的运算结果
ArrayList<Integer> results = new ArrayList<Integer>();
char array[] = s.toCharArray();
//括号栈
Stack<Character> bracket = new Stack<Character>();
//运算符号栈
Stack<Character> operation = new Stack<Character>();
//所有式子相当于被一个大括号所包含,所以要提前在括号结果集中加入一个结果
results.add(0);
//这个+是为了把该括号内的第一个数或者该括号内第一个括号所求得的值加到该括号的总值上,下if(array[i]=='(')内同
operation.push('+');
for(int i=0;i<array.length;i++)
{
if(array[i]==' ')
{
continue;
}
if(isInteger(array[i]))
{
int num = 0;
//对大于9的数字的获取
while(i<array.length&&isInteger(array[i]))
{
num = num*10+array[i]-48;
i += 1;
}
i -= 1;
//括号集中有n个括号,那么现在就在计算第n个括号内的算式
int sum = Operating(results.get(bracket.size()),num,operation.pop());
results.set(bracket.size(),sum);
}
if(array[i]=='(')
{
bracket.push(array[i]);
//添加新的结果集
results.add(0);
operation.push('+');
}
//括号内的算式计算结束先将值加在其最近外层括号的结果上,再在结果集将该结果移除
//这样做是为了始终保持当前计算的括号(倒数第一个结果集)被包含于倒数第二个结果集的括号
//简单来讲是为了处理一个括号内多个括号的计算类似(()+()-())
if(array[i]==')')
{
bracket.pop();
int num = Operating(results.get(results.size()-2),results.get(results.size()-1),operation.pop());
results.set(results.size()-2,num);
results.remove(results.size()-1);
}
if(array[i]=='+'||array[i]=='-')
{
operation.push(array[i]);
}
}
//results.get(0)相当于包含所有式子的那个大括号内算式的结果也就是最终结果
return results.get(0);
}
public static void main(String[] args) {
String s = "12345";
System.out.println(calculate(s));
}
}