20. 有效的括号
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频链接:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili
文章链接:代码随想录
知识点链接:【Java集合类】之 LinkedList(链表)-CSDN博客
(用于查找LinkedList的方法)
思路
利用栈,首先判断是否为奇数,奇数一定消不了。定义一个指针i遍历整个栈,将遍历到的左括号反着存进栈里。每次遍历到右括号的时候先与栈顶元素进行匹配,如果相等就消掉栈顶元素,不相等返回false(3)。如果还没遍历完栈就空了,同时出现右括号,说明右括号多了,返回false(2)。最后看栈是否为空,不为空则返回false(情况1)。
三种返回false情况
1.左括号多了
2.右括号多了
3.左括号和右括号不匹配
代码
class Solution {
public boolean isValid(String s) {
if(s.length()%2!=0)return false;
LinkedList<Character>list=new LinkedList<>();
//左括号
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='(')list.add(')');
else if(s.charAt(i)=='[')list.add(']');
else if(s.charAt(i)=='{')list.add('}');
//
else if(list.isEmpty()||list.getLast()!=s.charAt(i)){
return false;
}
else {
list.removeLast();
}
}
if(list.isEmpty())return true;
else return false;
}
}
1047. 删除字符串中的所有相邻重复项
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频链接:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili
文章链接:代码随想录
冷门方法
StringBuffer中的deleteCharAt(i); i为索引
思路
注意只有top<0时元素才是空的。首先用指针遍历,如果指针与栈顶元素相同就删除该元素,不同则存入。
代码
class Solution {
public String removeDuplicates(String s) {
StringBuilder sb=new StringBuilder();
int top=-1;//top为栈顶元素
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(top>=0&&c==sb.charAt(top)){
sb.deleteCharAt(top);//删除栈顶元素
top--;
}else{
sb.append(c);
top++;
}
}
return sb.toString();
}
}
150. 逆波兰表达式求值
题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
视频链接:栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili
文章链接 :代码随想录
方法
int i=parseInt(String s) String转int
Integer.volueOf(O) 类型转化
思路
名词解释:逆波兰表达式
计算机更明白的语言,先将算式转化为二叉树的形式,然后按照左中右的顺序写出。
这个过程可通过栈模拟,给到一个字符数组,遍历,遇到数字就存,遇到符号就取栈顶两个元素进行运算。
代码
注意
由于给的是字符串数组,所以不能强转,也不能用==,要用equals
-法和/法要特殊处理
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList();
for (String s : tokens) {
if ("+".equals(s)) {
stack.push(stack.pop() + stack.pop()); // 注意 - 和/ 需要特殊处理
} else if ("-".equals(s)) {
stack.push(-stack.pop() + stack.pop());
} else if ("*".equals(s)) {
stack.push(stack.pop() * stack.pop());
} else if ("/".equals(s)) {
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);
} else {
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}
总结
学习了两个小时,加深了对栈的理解,写波兰表达式这道题的时候自己写了一遍由于漏掉了许多东西,所以经常报错。感觉前两道题跟着视频走不难,后面一道题要注意的错误更多。