LeetCode:20. 有效的括号 - 力扣(LeetCode)
1.思路
用栈实现先入后出,只要括号是匹配对称的,则stack.isEmpty()返回true,否则返回false。
思路:遇到左括号将对应的右括号入栈,遇到右括号将栈中元素输出与之匹配判断,不等则为false。
极值情况:左括号多、右括号多、左右不匹配,左括号多和左右不匹配的判断是一致的,判断栈中字符和字符串对应的字符是否匹配:c != stack.pop(),右括号多时,栈是空的,需要对栈做判空处理:stack.isEmpty()
2.代码实现
class Solution {
public boolean isValid(String s) {
// if (s.length() % 2 != 0) return false;
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '[') {
stack.push(']');
} else if (c == '(') {
stack.push(')');
} else if (c == '{') {
stack.push('}');
} else if (stack.isEmpty() || c != stack.pop()) {
return false;
}
}
return stack.isEmpty();
}
}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(n).
LeetCode:1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
1.思路
借助栈的对称性,栈顶元素和当前字符串匹配时即可直接弹出,否则加入栈,之后遍历栈,将其赋值给字符串,可变字符换串反转转换成String类型输出即可.
2.代码实现
class Solution {
public String removeDuplicates(String s) {
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
if (stack.isEmpty() || s.charAt(i) != stack.peek()){
stack.push(s.charAt(i));
} else {
stack.pop();
}
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
sb.append(stack.pop());
}
return sb.reverse().toString();
}
}
3.复杂度分析
时间复杂度:O(n + m).
空间复杂度:O(m).
LeetCode:150. 逆波兰表达式求值 - 力扣(LeetCode)
1.思路
将"+、-、*、/" 四种情况直接操作,其他的入栈String[]元素转为int的值:
Integer.parseInt(tokens[i])
2.代码实现
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < tokens.length; i++) {
if (tokens[i].equals("+")) { // "+" 必须带双引号
int a = stack.pop();
int b = stack.pop();
int c = a + b;
stack.push(c);
} else if (tokens[i].equals("-")) { // 只能equals()方法比较
int a = stack.pop();
int b = stack.pop();
int c = b - a; // 注意前者 - 后者,前者在前后弹出
stack.push(c);
} else if (tokens[i].equals("*")) {
int a = stack.pop();
int b = stack.pop();
int c = a * b;
stack.push(c);
} else if (tokens[i].equals("/")) {
int a = stack.pop();
int b = stack.pop();
int c = b / a; // 同减号操作
stack.push(c);
} else {
stack.push(Integer.parseInt(tokens[i])); // 将string[]数组元素转化为int类型的数值方法...
}
}
return stack.pop();
}
}
3.复杂度分析
时间复杂度:O(n).
空间复杂度:O(1).