栈与队列的应用
20.有效的括号
解题思路:
- 用栈模拟, 每当遇到一个右括号时, 就弹出一个左括号
- 若弹出的符号与右括号不匹配时, 匹配失败
- 当最后栈为空的时候, 算是有效括号匹配
代码:
class Solution {
public boolean isValid(String s) {
HashMap<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
Deque<Character> deque = new ArrayDeque<>();
char[] ch = s.toCharArray();
for(int i=0; i<ch.length; i++){
if(deque.isEmpty() || ch[i]=='(' || ch[i]=='{' || ch[i]=='['){
deque.push(ch[i]);
} else{
if(deque.pop() != map.get(ch[i])){
return false;
}
}
}
return deque.isEmpty();
}
}
1047.删除字符串中的所有相邻重复项
解题思路:
-
用栈模拟, 每当进栈一个字符时, 判断栈顶字符是否相等, 若相等则弹出, 不相等则入栈
-
代码:
class Solution {
public String removeDuplicates(String s) {
Deque<Character> deque = new ArrayDeque<>();
char[] ch = s.toCharArray();
for(int i=0; i<ch.length; i++) {
if(deque.isEmpty() || deque.peek() != ch[i]){
deque.push(ch[i]);
}else{
deque.pop();
}
}
StringBuilder sb = new StringBuilder();
while(!deque.isEmpty()){
sb.append(deque.pop());
}
return sb.reverse().toString();
}
}
150.逆波兰表达式
解题思路:
- 用栈模拟, 每当遇到一个运算符时, 就弹出栈顶两个元素进行计算, 然后将结果存入栈顶
- 最后只存在栈顶一个元素, 返回栈顶计算结果即可
代码:
class Solution {
public int evalRPN(String[] tokens) {
Deque<String> deque = new ArrayDeque<>();
for(int i=0; i<tokens.length; i++){
if(tokens[i].equals("+")){
int x = Integer.parseInt(deque.pop());
int y = Integer.parseInt(deque.pop());
deque.push(String.valueOf(y + x));
}else if(tokens[i].equals("-")) {
int x = Integer.parseInt(deque.pop());
int y = Integer.parseInt(deque.pop());
deque.push(String.valueOf(y - x));
}else if(tokens[i].equals("*")) {
int x = Integer.parseInt(deque.pop());
int y = Integer.parseInt(deque.pop());
deque.push(String.valueOf(y * x));
}else if(tokens[i].equals("/")) {
int x = Integer.parseInt(deque.pop());
int y = Integer.parseInt(deque.pop());
deque.push(String.valueOf(y / x));
}else {
deque.push(tokens[i]);
}
}
return Integer.parseInt(deque.pop());
}
}