day10:栈与队列part2
20.有效的括号
不匹配的情况有三种,分别判断
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '[' || c == '{') stack.push(c);
else {
// 左括号被匹配完了,有多余的右括号情况
if (stack.isEmpty()) return false;
// 中间不匹配情况
char ch = stack.pop();
if (c == ')' && ch != '(') return false;
if (c == ']' && ch != '[') return false;
if (c == '}' && ch != '{') return false;
}
}
// 有多余的左括号没被匹配弹出情况
return stack.isEmpty();
}
}
1047.删除字符串中的所有相邻重复项
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (stack.isEmpty() || stack.peek() != c) stack.push(c);
else stack.pop();
}
String str = "";
while (!stack.isEmpty()) str = stack.pop() + str;
return str;
}
}
不用库函数运行时间更短
class Solution {
public String removeDuplicates(String s) {
StringBuffer sb = new StringBuffer();
int i = -1;
for (char c : s.toCharArray()) {
if (i < 0 || sb.charAt(i) != c) {
sb.append(c);
i++;
} else {
sb.deleteCharAt(i);
i--;
}
}
return sb.toString();
}
}
150.逆波兰表达式求值
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> s = new Stack<>();
for (String str : tokens) {
if (str.equals("+")) s.push(s.pop() + s.pop());
else if (str.equals("-")) s.push(-s.pop() + s.pop());
else if (str.equals("*")) s.push(s.pop() * s.pop());
else if (str.equals("/")) {
int second = s.pop();
int first = s.pop();
s.push(first / second);
} else {
s.push(Integer.valueOf(str));
}
}
return s.pop();
}
}