今日更改
从今天起简介一下博客的写法,思路简洁一点,具体步骤阐述在代码注释内
今日主要题目
主要学习网址
做题思路与具体代码
题目一:20. 有效的括号
做题思路
本题采用栈的思路
分以下三种情况
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
每次遇到左括号就去栈里面存入它的右括号,遇到右括号就去栈里面找
具体代码
class Solution {
public boolean isValid(String s) {
//栈的声明
//三种情况
//第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
//第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
//第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
Deque<Character> deque=new LinkedList<>();
//遍历字符串
for(int i=0;i<s.length();i++){
char a=s.charAt(i);
//遇到所有左括号就将他的有括号入栈
if(a=='(') deque.push(')');
else if(a=='{')deque.push('}');
else if(a=='[')deque.push(']');
//遍历的过程中如果遇到右括号但是栈里面没有了或者是此时栈顶不是我们想要的元素
//就直接返回false
//包括第二种情况和第三种情况
else if(deque.isEmpty()||deque.peek()!=a)return false;
//如果栈顶此时是我们想要的元素,就直接弹出
else deque.pop();
}
//遍历完字符串发现栈里面还有元素,就返回false
//第一种情况
return deque.isEmpty();
}
}
题目二:1047. 删除字符串中的所有相邻重复项
做题思路
遍历字符串跟栈内元素比较,一样弹出栈顶元素,不一样入栈
具体代码
class Solution {
public String removeDuplicates(String s) {
//声明栈
//注意这里要用linkedlist还是arraydeque
//用arraydeque更快
//ArrayDeque会比LinkedList在除了删除元素这一点外会快一点
Deque<Character> deque=new ArrayDeque<>();
//遍历字符串
for(int i=0;i<s.length();i++){
//与栈顶元素比较,要是不一样就存入
//前面要有个判断是否为空防止溢出
//这里必须要先写deque.isEmpty()||s.charAt(i)!=deque.peek()这种情况
//不能先写deque.isEmpty()||s.charAt(i)!=deque.peek()
//第二种情况会造成空指针异常
if(deque.isEmpty()||s.charAt(i)!=deque.peek()){
deque.push(s.charAt(i));
}else{
// 栈不为空且相等,就弹出栈顶元素
deque.pop();
}
}
//遍历完了,遍历将栈内所有元素弹出并放到字符串内
String result="";
while(!deque.isEmpty()){
//注意这个字符串加的顺序
result=deque.pop()+result;
}
return result;
}
}
题目三:150. 逆波兰表达式求值
做题思路
遍历字符串数组遇到数字存入栈中,遇到运算符从栈中取出两个元素算出结果再插入栈中
具体代码
class Solution {
public int evalRPN(String[] tokens) {
//用栈的思路
//声明栈
//用ArrayDeque会更快
Deque<Integer> deque=new ArrayDeque<>();
//遍历字符串数组
for(String s:tokens){
//如果字符串等价于运算符,那么就从栈中抽出两个元素来进行计算
//记住字符串比较要用equals
if ("+".equals(s)) {
deque.push(deque.pop() + deque.pop());
} else if ("-".equals(s)) {
deque.push(-deque.pop() + deque.pop());
} else if ("*".equals(s)) {
deque.push(deque.pop() * deque.pop());
} else if ("/".equals(s)) {
int temp1 = deque.pop();
int temp2 = deque.pop();
deque.push(temp2 / temp1);
} else {
//否则就插入元素,记住必须插入integer类型的
deque.push(Integer.valueOf(s));
}
}
return deque.pop();
}
}