代码随想录算法训练营第十一天 | LeetCode 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
一、 LeetCode 20. 有效的括号
1. 题目链接
2. 学习资料:
3.思路
括号匹配是使用栈解决的经典问题。
- 括号匹配有三种不匹配的情况:
- 字符串里左方向的括号多余了 ,所以不匹配。(这时会出现辅助栈里还省有多余元素)
- 括号不多余,但是括号类型匹配不上
- 字符串里右方向的括号多余了 (这时会出现辅助栈为空)
4. 代码
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
if(s.length() % 2 != 0){
return false;
}
for(int i=0;i<s.length();i++){
if(s.charAt(i) == '{'){
stack.push('}');
}else if(s.charAt(i) == '('){
stack.push(')');
}else if(s.charAt(i) == '['){
stack.push(']');
}else if(stack.isEmpty() || stack.peek() != s.charAt(i)){
//这个判断对应第2,3两种括号不匹配的情况
return false;
}else{
stack.pop();
}
}
//对应情况1,如果左方向的括号多了,那么栈一定不为空,就会returnfalse
return stack.isEmpty();
}
}
二、 LeetCode 1047. 删除字符串中的所有相邻重复项
1. 题目链接
2. 学习资料:
3.思路
- 可以用栈来解决
- 循环遍历字符串,如果栈中无元素,将字符加进栈中
- 如果栈中有元素,如果栈顶元素与遍历到的字符串的字符不相等,那么将这个字符压入栈。
- 如果相等,那么将栈顶元素弹出
- 最后循环栈中元素,拼接成原本顺序的字符串返回。
- 本题使用了字符串来模拟栈的操作
4. 代码
class Solution {
public String removeDuplicates(String s) {
StringBuffer result = new StringBuffer();
int top = -1;
for(int i=0;i<s.length();i++){
char c = s.charAt(i);
if(top>=0 && result.charAt(top) == c){
result.deleteCharAt(top);
top--;
}else{
result.append(c);
top++;
}
}
return result.toString();
}
}
三、 LeetCode 150. 逆波兰表达式求值
1. 题目链接
2. 学习资料:
3.思路
这道题的易错点是,栈的特性先进后出,所以在做减法和除法运算时,一定要记住是后出来的数是被减数或是被除数
4. 代码
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> res = new ArrayDeque();
for(String s : tokens){
if(s.equals("+")){
res.push(res.pop() + res.pop());
}else if(s.equals("-")){
int num1 = res.pop();
int num2 = res.pop();
res.push(num2 - num1);
}else if(s.equals("*")){
res.push(res.pop() * res.pop());
}else if(s.equals("/")){
int num1 = res.pop();
int num2 = res.pop();
res.push(num2 / num1);
}else{
res.push(Integer.valueOf(s));
}
}
return res.pop();
}
}