20. 有效的括号
思路:分别将三种左括号所对应的右括号进栈;如果该元素是右括号,每推一个元素就判断栈顶元素是否与推入的元素相等,如果不相等则直接返回false,如果相等则pop栈顶元素。
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
char ch;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
if (ch == '(') {
stack.push(')');
} else if (ch == '[') {
stack.push(']');
} else if (ch == '{') {
stack.push('}');
} else if (stack.isEmpty() || stack.peek() != ch) {
return false;
} else {
stack.pop();
}
}
return stack.isEmpty();
}
}
题目链接/文章讲解/视频讲解:programmercarl.com/0020.%E6%9C…
1047. 删除字符串中的所有相邻重复项
思路:将元素一一推入,每次推入前都判断栈顶元素是否与要推入元素相等,如果相等则将栈顶元素推出,实现消消乐。
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
char ch;
for(int i =0; i<s.length(); i++) {
ch=s.charAt(i);
if(stack.isEmpty()) {
stack.push(ch);
} else if(ch == stack.peek()){
stack.pop();
}else {
stack.push(ch);
}
}
//将栈中的字符转换为字符串输出
String reverse = "";
while (!stack.empty()) {
reverse = stack.pop().toString() + reverse;
}
return reverse;
}
}
题目链接/文章讲解/视频讲解:programmercarl.com/1047.%E5%88…
150. 逆波兰表达式求值
思路:逆波兰表达式,其实就是后缀表达式,遇到数字直接推入栈;遇到操作符,就将前面两个数字根据操作符进行处理
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList();
for (String s : tokens) {
if ("+".equals(s)) { // leetcode 内置jdk的问题,不能使用==判断字符串是否相等
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();
}
}
题目链接/文章讲解/视频讲解:programmercarl.com/0150.%E9%80…
总结
今天三题难度不是很大,都是栈的基础应用,了解栈的性质以后,用起来就很得心应手了,