使用栈来解决,分析题目中括号不匹配的几种情况:
- 左方向的括号多余
- 右方向的括号多余
- 左右括号不匹配
题目说左括号必须以正确的顺序闭合,为简便操作,统一在栈中放入右括号
class Solution {
public boolean isValid(String s) {
Deque<Character> deque = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
char 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) {
return false;
} else {
deque.pop();
}
}
return deque.isEmpty();
}
}
使用栈来解题。遍历字符串s,如果栈为空或当前字符与栈顶元素不匹配,则将当前元素放入栈中,最后字符倒序相加转为字符串。
class Solution {
public String removeDuplicates(String s) {
Deque<Character> deque = new LinkedList<>();
char ch;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
if (deque.isEmpty() || deque.peek() != ch) {
deque.push(ch);
} else if (deque.peek() == ch) {
deque.pop();
}
}
String str = "";
while (!deque.isEmpty()) {
str = deque.pop() + str;
}
return str;
}
}
题目给定波兰表达式,不用判断不符合的情况。遍历字符串数组,判断当前节点是否为算符,不为算符将当前元素放入栈中,若为算符,对当前栈中元素pop两次,并计算,最后将计算结果放入栈中,最后结果即为值。
class Solution {
public int evalRPN(String[] tokens) {
Deque<Integer> deque = new ArrayDeque<>();
int a;
int b;
for (String token : tokens) {
if ("+".equals(token)) {
b = deque.pop();
a = deque.pop();
deque.push( a + b);
} else if ("-".equals(token)) {
b = deque.pop();
a = deque.pop();
deque.push(a - b);
} else if ("*".equals(token)) {
b = deque.pop();
a = deque.pop();
deque.push(a * b);
} else if ("/".equals(token)) {
b = deque.pop();
a = deque.pop();
deque.push(a / b);
} else {
deque.push(Integer.valueOf(token));
}
}
return deque.pop();
}
}