leetcode题目链接
这题其实和逆波兰表达式很像,无非多了个(和)
我们可以定义三个变量。
result表示当前计算结果
sign表示是+还是-
number表示当前数字
遍历字符串
利用isDigit 方法 提出数字
如果遇到加号result+=sign*number
减号则将sign=-1;
如果遇到(则先将当前的result和sign存入栈内
当遇到)在弹出
要主要的是末尾字符如果是数字且不为0一定记得加上。
代码如下:
import java.util.Stack;
// 给你一个字符串s,请你实现一个基本计算器来计算返回它的值
// 注意不允许使用任何字符串作为字符串作为数学表达式计算的内置函数,比如eval
public class calculate {
public int calculate(String s){
// rsult 当前计算结果
// number当前正在处理的数字
// sign当前符号 1表示正 -1表示负
Stack<Integer>stack =new Stack<>();
int result = 0;
int sign = 1;
int number = 0;
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(Character.isDigit(c)){
number=number*10+c-'0';
}
else if(c=='+'){
result=result+sign*number;
number=0;
sign=1;
}
else if(c=='-'){
result=result+sign*number;
number=0;
sign=-1;
}
else if(c=='('){
stack.push(result);
stack.push(sign);
result=0;
sign=1;
}
else if(c==')') {
result = result + sign * number;
number = 0;
result *= stack.pop();//弹出并应用括号前的符号
result += stack.pop();// 加上括号前的计算结果
}
}
if(number!=0){
result = result + sign * number;
}
return result;
}
}