20. 有效的括号
参考文章:代码随想录
参考视频:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili
解题思路:用栈来去解决问题,需要处理好3种错误的情况。
-
第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
-
第二种情况,括号没有多余,但是 括号的类型没有匹配上。
-
第三种情况,字符串里右方向的括号多余了,所以不匹配。
public static boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if(!match(stack,s.charAt(i))){
return false;
}
}
if(!stack.isEmpty()){
return false;
}
return true;
}
public static boolean match(Stack<Character> stack, char x) {
if (x == '(') {
stack.push(')');
} else if (x == '[') {
stack.push(']');
} else if (x == '{') {
stack.push('}');
} else {
if(stack.isEmpty()){
return false;
}else if (x == stack.peek()) {
stack.pop();
} else {
return false;
}
}
return true;
}
1047. 删除字符串中的所有相邻重复项
参考文章:代码随想录
参考视频:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项_哔哩哔哩_bilibili
解题思路:用栈的思想来去解决,遍历字符串,当栈最顶层元素与遍历的元素相等时将该元素从栈中弹出,最后得到的栈即是没有相邻重复项的字符串,最后处理返回正序的字符串。
public static String removeDuplicates(String s) {
Deque<Character> deque = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
if (deque.peek() != null && s.charAt(i) == deque.peek()) {
deque.pop();
} else {
deque.push(s.charAt(i));
}
}
String str = "";
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
return str;
}
150. 逆波兰表达式求值
参考文章:代码随想录
参考视频:栈的最后表演! | LeetCode:150. 逆波兰表达式求值_哔哩哔哩_bilibili
解题思路:理解好逆波兰表达式是什么意思后其实就很好做题了,当遇到数字时存入栈中,当遇到符号就将栈中最上面两位数拿出来进行该符号的运算,最后栈中的元素即使最终结果。需要注意在处理减法以及除法时候需要特殊处理。
public class Leetcode150 {
public static int evalRPN(String[] tokens) {
Deque<Integer> deque = new LinkedList<>();
for (String token : tokens) {
if ("+".equals(token)) {
deque.push(deque.pop() + deque.pop());
} else if ("-".equals(token)) {
deque.push(deque.pop() - deque.pop());
} else if ("*".equals(token)) {
deque.push(deque.pop() * deque.pop());
} else if ("/".equals(token)) {
int a = deque.pop();
int b = deque.pop();
deque.push(b / a);
} else {
deque.push(Integer.valueOf(token));
}
}
return deque.pop();
}