20:有效的括号
把每次入栈的元素和栈顶元素比较,如果相互匹配的话,把栈顶元素pop,如果不匹配的话,则把该元素入栈。最后如果栈是空的话,说明匹配了,非空则不匹配。
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (stack.isEmpty()) {
stack.push(s.charAt(i));
}else {
switch (s.charAt(i)) {
case ')':
if (stack.peek()=='(') {
stack.pop();
}else {
stack.push(s.charAt(i));
}
break;
case ']':
if (stack.peek()=='[') {
stack.pop();
}else {
stack.push(s.charAt(i));
}
break;
case '}':
if (stack.peek()=='{') {
stack.pop();
}else {
stack.push(s.charAt(i));
}
break;
default:
stack.push(s.charAt(i));
break;
}
}
}
return stack.isEmpty();
}
}
1047:删除字符串中的所有相邻重复项
与括号匹配类似,考察栈顶元素和待比较元素是否相同,相同则出栈,否则入栈。
class Solution {
public String removeDuplicates(String s) {
int len = s.length();
Stack<Character> stack = new Stack<>();
for (int i = 0; i < len; i++) {
if ((!stack.isEmpty())&&(stack.peek()==s.charAt(i))) {
stack.pop();
}else {
stack.push(s.charAt(i));
}
}
StringBuilder sBuilder = new StringBuilder();
while (!stack.isEmpty()) {
sBuilder.append(stack.pop());
}
sBuilder.reverse();
return sBuilder.toString();
}
}
150:逆波兰表达式求值
理解波兰表达式的原理的话,就能理解如何用栈来求解。
class Solution {
public int evalRPN(String[] tokens) {
int len = tokens.length;
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < len; i++) {
if (tokens[i].equals("+")) {
stack.push(stack.pop()+stack.pop());
}else if (tokens[i].equals("-")) {
int temp = stack.pop();
stack.push(stack.pop()-temp);
}else if (tokens[i].equals("*")) {
stack.push(stack.pop()*stack.pop());
}else if (tokens[i].equals("/")) {
int temp = stack.pop();
stack.push(stack.pop()/temp);
}else {
stack.push(Integer.parseInt(tokens[i]));
}
}
return stack.pop();
}
}