代码随想录算法训练营第十一天|栈与队列2
LeetCode 20.有效的括号
解题思路:
- 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
- 第二种情况,括号没有多余,但是 括号的类型没有匹配上。
- 第三种情况,字符串里右方向的括号多余了,所以不匹配。
代码如下:
class Solution {
public boolean isValid(String s) {
Deque<Character> deque = new LinkedList<>();
char ch;
for(int i = 0;i < s.length();i++){
ch = s.charAt(i);
if(ch == '('){//碰到左括号,就把相应的右括号入栈
deque.push(')');
}else if(ch == '{'){
deque.push('}');
}else if(ch == '['){
deque.push(']');
}else if(deque.isEmpty() || deque.peek() != ch){//对应2,3
return false;
}else {//如果是右括号判断是否和栈顶元素匹配
deque.pop();
}
}
return deque.isEmpty();
}
}
LeetCode 1047. 删除字符串中的所有相邻重复项
思路:画个栈,模拟一下过程,在输出时,先new一个空str,然后把元素一个个pop在str前面
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
难点:
ArrayDeque会比LinkedList在除了删除元素这一点外会快一点
代码如下:
class Solution {
public String removeDuplicates(String s) {
ArrayDeque<Character> deque = new ArrayDeque<>();
char ch;
for(int i = 0;i < s.length();i++){
ch = s.charAt(i);
if (deque.isEmpty() || deque.peek() != ch) {//此处入栈操作的判断条件重要点
deque.push(ch);
} else {
deque.pop();
}
}
String str = "";
//剩余的元素即为不重复的元素,加到str前面
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
return str;
}
}
LeeCode 150. 逆波兰表达式求值
难点:Integer.valueOf(s)把字符串s解析成Integer对象类型,返回的integer 可以调用对象中的方法。
代码如下:
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();
}
}