LeetCode_224.基本计算器
题目描述
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
代码实现
双栈的思想,数字栈和字符栈
class Solution {
public int calculate(String s) {
//******栈的预处理********
Deque<Integer> nums = new ArrayDeque<>();
nums.addLast(0);
Deque<Character> ops = new ArrayDeque<>();
s = s.replaceAll(" ","");
char []cs = s.toCharArray();
int n = cs.length;
//处理每一个字符
for(int i = 0 ; i < n ; i ++){
char c = cs[i];
// 处理 ( 左括号
if(c==() ops.addLast(c);
// 处理 ) 右括号
else if (c == )){
//操作符不空的情况下
while(!ops.isEmpty()){
char op = ops.peekLast();
//不为左括号的情况下,计算
if(op!=() calc(nums,ops);
else{
//如果是左括号,就出栈,结束循环
ops.pollLast();
break;
}
}
}else{
//如果的数字的话 入nums栈
if(isNum(c)){
int u = 0 ;
while(i<n && isNum(cs[i])) u = u*10+(int)(cs[i++]-0);
nums.addLast(u);
i--;
}
//如果是运算符的话,如果前面是左括号,就先插入0,防止负数运算,如果不是,先运算完可以运算的操作
else{
if(i>0 && cs[i-1]==() nums.addLast(0);
//如果运算符不为空,而且运算符也不是左括号,运算可以运算的部分
while(!ops.isEmpty() && ops.peekLast()!=() calc(nums,ops);
//插入运算符
ops.addLast(c);
}
}
}
//当运算符不为空的情况继续计算直至运算完成
while(!ops.isEmpty()) calc(nums,ops);
//返回最终结果
return nums.peekLast();
}
void calc(Deque<Integer> nums,Deque<Character> ops){
// *******判断部分*******
//数字不足时,无法计算
if(nums.isEmpty() || nums.size()<2) return;
//没有运算符时,无法计算
if(ops.isEmpty()) return ;
//提出栈顶的两个数
// *******计算部分*******
int b = nums.pollLast(),a=nums.pollLast();
char op = ops.pollLast();
nums.addLast(op==+?a+b:a-b);
}
//判断字符是否的数字的函数
boolean isNum(char c){
return Character.isDigit(c);
}
}
上一篇:
92天倒计时,蓝桥杯省赛备赛攻略来啦~
