栈的经典应用
相关数据结构:
Deque<Integer> stack = new ArrayList<>();
stack.push(); //添加元素
stack.pop(); //弹出元素
stack.peek(); //获得栈顶元素但不弹出
stack.isEmpty(); //判空
stack.size(); //元素个数
20. 有效的括号
题目链接:20. 有效的括号
代码:
class Solution {
public boolean isValid(String s) {
Deque<Character> stack = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else {
if (stack.isEmpty()) return false;
char temp = stack.pop();
System.out.println(temp);
System.out.println(c);
if (!(temp == '(' &&c == ')' || temp == '[' && c == ']' || temp == '{' && c == '}')) {
return false;
}
}
}
if (!stack.isEmpty()) {
return false;
}
return true;
}
}
1047. 删除字符串中的所有相邻重复项
题目链接:1047. 删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
Deque<Character> stack = new LinkedList<>();
char ch;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
if (stack.isEmpty() || stack.peek() != ch) {
stack.push(ch);
} else {
stack.pop();
}
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}
150. 逆波兰表达式求值
只要知道后缀表达式的含义以及计算方式,就很容易实现该代码
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList<>();
int left, right;
for (String str : tokens) {
if("+".equals(str)) {
stack.push(stack.pop() + stack.pop());
} else if ("-".equals(str)) {
stack.push(-stack.pop() + stack.pop());
} else if ("*".equals(str)) {
stack.push(stack.pop() * stack.pop());
} else if ("/".equals(str)) {
right = stack.pop();
left = stack.pop();
stack.push(left / right);
} else {
stack.push(Integer.parseInt(str));
}
}
return stack.pop();
}
}