1.有效的括号
总结出不合格的情况,一共有如下三种
思路:遍历字符串,遇到左括号就将其对应的右括号放入stack中,遇到右括号就会出现三种情况,我们来分别判断。
第一种情况:字符串左方向的括号多余了。对应的情况就是在遍历完字符串之后,stack不为空。此时返回FALSE
第二种情况:括号没有多余,但是括号的类型没有匹配上。对应的情况就是在遍历字符串右括号的过程中,当前的右括号与stack顶部的括号不一致,此时返回FALSE
第三种情况:字符串里右方向的括号多余了,所以不匹配。对应的情况就是在遍历字符串右括号的过程中,stack已经为空了。此时返回FALSE
public boolean isValid(String s) {
ArrayDeque<Character> stack = new ArrayDeque<>();
char ch;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
//碰到左括号,就把相应的右括号入栈
if (ch == '(') {
stack.push(')');
}else if (ch == '{') {
stack.push('}');
}else if (ch == '[') {
stack.push(']');
} else if (stack.isEmpty() || stack.peek() != ch) {
return false;
}else {//如果是右括号判断是否和栈顶元素匹配
stack.pop();
}
}
//最后判断栈中元素是否匹配
return stack.isEmpty();
}
2.删除字符串中的所有相邻重复项
public String removeDuplicates(String s) {
ArrayDeque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
char charAt = s.charAt(i);
if (stack.isEmpty() || stack.peek() != charAt) {
stack.push(charAt);
} else if (stack.peek() == charAt) {
stack.pop();
}
}
int size = stack.size();
char[] result = new char[size];
for (int i = 0; i < size; i++) {
result[i] = stack.pop();
}
//因为栈是先进后出,所以要将结果进行反转
return reverse(result);
}
public String reverse(char[] chars) {
int start = 0;
int end = chars.length - 1;
char temp;
while (start < end) {
temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
start++;
end--;
}
return new String(chars);
}
3. 逆波兰表达式求值
public int evalRPN(String[] tokens) {
Deque<Integer> stack = new LinkedList();
for (String s : tokens) {
if ("+".equals(s)) { // leetcode 内置jdk的问题,不能使用==判断字符串是否相等
stack.push(stack.pop() + stack.pop()); // 注意 - 和/ 需要特殊处理
} else if ("-".equals(s)) {
stack.push(-stack.pop() + stack.pop());
} else if ("*".equals(s)) {
stack.push(stack.pop() * stack.pop());
} else if ("/".equals(s)) {
int temp1 = stack.pop();
int temp2 = stack.pop();
stack.push(temp2 / temp1);
} else {
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}