1.括号匹配问题
1.1 有效的括号:用哈希表的 key 存储左半边符号,用 value 存储右半边符号,然后用栈去匹配左右括号,注意不仅要左右括号类型匹配,数量也要匹配。
java
public boolean isValid(String s) {
if (s.length() <= 1) {
return false;
}
Map<Character, Character> smap = new HashMap<>();
smap.put('(', ')');
smap.put('{', '}');
smap.put('[', ']');
Stack<Character> stack = new Stack();
for (int i = 0; i < s.length(); i++) {
char item = s.charAt(i);
// 左括号就直接入栈
if (smap.containsKey(item)) {
stack.push(item);
} else {// 右括号就进行判断
// 栈不为空才进行下一步判断,栈为空直接返回false
if (!stack.isEmpty) {
Character left = stack.pop();
char right = smap.get(left);
if (right != item) {
return false;
}
} else {
return false;
}
}
}
// 循环结束以后如果栈里还有左括号,则返回false
return stack.isEmpty();
}
1.2 有效括号生成:【持续更新】。
1.3 最长有效括号:【持续更新】。
2.最小栈
设计一个能在常数时间内检索到最小元素的栈。
java
class MinStack {
Deque<Integer> xStack;
Deque<Integer> minStack;
public MinStack() {
xStack = new LinkedList<Integer>();
minStack = new LinkedList<Integer>();
minStack.push(Integer.MAX_VALUE);
}
public void push(int x) {
// 这里用LinkedList表示栈,使用push方法,后续同理
xStack.push(x);
minStack.push(Math.min(minStack.peek(), x));
}
public void pop() {
xStack.pop();
minStack.pop();
}
public int top() {
return xStack.peek();
}
public int getMin() {
return minStack.peek();
}
}
3.最大栈
设计一个支持查找或弹出栈中最大元素的栈。
java
class MaxStack {
Stack<Integer> stack;
Stack<Integer> maxStack;
public MaxStack() {
stack = new Stack();
maxStack = new Stack();
}
public void push(int x) {
int max = maxStack.isEmpty() ? x : Math.max(maxStack.peek(), x);
stack.push(x);
maxStack.push(max);
}
public int pop() {
maxStack.pop();
return stack.pop();
}
public int top() {
return stack.peek();
}
public int peekMax() {
return maxStack.peek();
}
public int popMax() {
int max = peekMax();
Stack<Integer> buffer = new Stack();
while (top() != max) {
buffer.push(pop());
}
// 把最大值弹出
pop();
while (!buffer.isEmpty()) {
push(buffer.pop());
}
return max;
}
}
如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤
个人主页:星不易 ♥
算法通关村专栏:不易|算法通关村 ♥