LeetCode20 有效的括号
题目链接:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html代码:
public class code20 {
public boolean isValid(String s) {
char[] ss = s.toCharArray();
Stack<Character> characters = new Stack<Character>();
for (int i = 0; i < ss.length; i++) {
// 如果出现左括号,将对应的右括号加入到栈中
if (ss[i] == '(') {
characters.push(')');
} else if (ss[i] == '[') {
characters.push(']');
} else if (ss[i] == '{') {
characters.push('}');
// 如果还未遍历完成栈已经为空(说明有多余右括号)或者遍历到的元素不等于栈顶元素,说明不匹配(括号类型不匹配)
} else if (characters.isEmpty() || ss[i] != characters.peek()) {
return false;
} else {
characters.pop();
}
}
// 如果遍历完栈还不为空,说明不匹配(有多余的左括号)
return characters.isEmpty();
}
}
注意搞清楚三种情况,代码就比较好写了
LeetCode1047 删除字符串中的所有相邻重复项
public class code1047 {
public String removeDuplicates(String s) {
// 直接使用字符串模拟栈的行为,省去了将栈转为字符串的操作
StringBuffer res = new StringBuffer();
int top = -1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (top >= 0 && res.charAt(top) == c) {
res.deleteCharAt(top);
top--;
} else {
res.append(c);
top++;
}
}
return res.toString();
}
}
使用字符串模拟栈可以省去将栈转为字符串的操作
LeetCode150 逆波兰表达式求值
public class code150 {
public int evalRPN(String[] tokens) {
Deque<Integer> res = new LinkedList<>();
// 遇到数字加入到栈中,遇到运算符取出栈顶的两个元素做相应的运算,然后把结果加入到栈中
for (int i = 0; i < tokens.length; i++) {
if (tokens[i].equals("+") || tokens[i].equals("-") || tokens[i].equals("*") || tokens[i].equals("/")) {
if (tokens[i].equals("+")) {
int num1 = res.pop();
int num2 = res.pop();
res.push(num1 + num2);
} else if (tokens[i].equals("-")) {
int num1 = res.pop();
int num2 = res.pop();
res.push(num2 - num1);
} else if (tokens[i].equals("*")) {
int num1 = res.pop();
int num2 = res.pop();
res.push(num1 * num2);
} else {
int num1 = res.pop();
int num2 = res.pop();
res.push(num2 / num1);
}
} else {
res.push(Integer.parseInt(tokens[i]));
}
}
return res.pop();
}
}
思想不难,注意减法和除法要单独处理一下,容易出错