20. 有效的括号
题目链接:20. 有效的括号 - 力扣(LeetCode)
文档讲解:代码随想录 (programmercarl.com)
视频讲解:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili
解题思路:
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
//创建用于储存右括号的栈
char[] cs = s.toCharArray();
for (char c : cs) {
if (c == '(') {
stack.push(')');
} else if (c == '[') {
stack.push(']');
} else if (c == '{') {
stack.push('}');
//向栈中添加三种左括号对应的右括号
} else if (stack.isEmpty() || c != stack.peek()) {
return false;
//栈已为空或左右括号不匹配
} else {
stack.pop();
//括号匹配消消乐
}
}
return stack.isEmpty();
//此时栈不为空说明左括号冗余,左右括号不匹配
}
}
时间复杂度:O(n)
该题总结:解决这题的关键在于将左括号所对应的右括号加入到栈内,字符串中遇到右括号时再与栈中的右括号做匹配,这样这道题的大致解题思路也就出来了。
1047. 删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
文档讲解:代码随想录 (programmercarl.com)
视频讲解:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili
解题思路:
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
//该字符数组用于删除相同的字母
for (char c : s.toCharArray()) {
//遍历字符串
if (!stack.isEmpty() && stack.peek() == c) {
//避免对空栈操作
stack.pop();
//字符串与栈顶字母匹配时删除栈顶字母并让字符串遍历到下一个元素
} else {
stack.push(c);
//将当前字母添加到栈顶
}
}
StringBuilder result = new StringBuilder();
while (!stack.isEmpty()) {
result.append(stack.pop());
}
//将栈中每个元素添加到result中
return result.reverse().toString();
//让result倒序输出为字符串
}
}
时间复杂度:O(n)
该题总结:这题在弄懂栈的原理(先入后出)之后就很简单了,将字符串中的字母与栈中的字母做匹配,相同则删除,不同则添加到栈中,思路清晰,难度不大。
150. 逆波兰表达式求值
题目链接:150. 逆波兰表达式求值 - 力扣(LeetCode)
文档讲解:代码随想录 (programmercarl.com)
视频讲解:栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili
解题思路:
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 tmp1 = stack.pop();
int tmp2 = stack.pop();
stack.push(tmp2 / tmp1);
} else {
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}
时间复杂度:O(n)
该题总结:这题对于我这种java小白来说就不太友好了,不懂对字符串数组的操作,所以这道题基本上全是照着题解写的,这次一刷主要要记住的是对栈的理解以及对字符串数组的操作,这道题本身难度不大,但由于我不会用方法就很难独立写出来。