1 括号匹配问题: 给定一个只包括 ‘(’ , ‘)’ , ‘{’ , ‘}’ ,’[’ , ‘]’ 的字符串, 判断字符串是否有效.
public boolean isValid(String s) {
Map<Character, Character> map = new HashMap<>();
map.put('(', ')');
map.put('[', ']');
map.put('{', '}');
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
1 判定 c是否是左括号, 如果是左括号就入栈
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
continue;// 进入下次循环, 取出下一个字符
}
if (stack.empty()) {
2 如果发现当前字符不是左括号, 并且栈又为空, 也是非法字符串
return false;
}
通过 map进行判断.
char top = stack.pop();
if (map.get(top) == c) {
continue;
}
3 剩下的都是非法的字符串
return false;
}
4 遍历如果是 空栈才能是合法的字符串
if (stack.empty()) {
return true;
}
return false;
}
2 最小栈问题: 设计一个支持 push, pop, top 操作, 并能在常数时间 O(1) 内检索到最小元素的栈. (通过定义 A B 两个栈来解决).
public class MinStack {
private Stack<Integer> A = new Stack<>(); // A进行push, pop, top 操作
private Stack<Integer> B = new Stack<>(); // B进行出栈操作
public void push(int x) {
A.push(x);
if (B.isEmpty()) {
B.push(x);
return;
}
int min = B.peek();
if (x < min) {
min = x;
}
入栈时A每入一次, B都要入一次栈, 同时要保证 B的栈顶元素最小.
B.push(min);
}
public Integer pop() {
A出栈的时候B也同时出栈, 这样才能保证 B的栈顶元素是最小元素.
if (A.isEmpty()) {
return null;
}
B.pop();
return A.pop();
}
public Integer top() {
if (A.isEmpty()) {
return null;
}
return A.peek();
}
public Integer getMin() {
获取最小元素, B的栈顶元素 就是最小值.
if (B.isEmpty()) {
return null;
}
return B.peek();
}
}
3 出栈顺序问题: 输入两个整数序列, 第一个序列表示栈的压入顺序, 请判断第二个序列是否可能为该栈的弹出顺序 (注意: 这两个序列的长度是相等的)
public class DemoA {
public boolean IsPopOrder(int[] pushA, int[] popA) {
if (pushA == null || popA == null || pushA.length == 0 || popA.length == 0 || pushA.length != popA.length) {
return false;
}
Stack<Integer> stack = new Stack<>();
int i = 0;
int j = 0;
for (; i < pushA.length; i++) {
1 如果下面的条件不满足, 就要一直入栈.
stack.push(pushA[i]);
2 如果栈不为空, 并且两个元素相等, 就要一直出栈.
while (!stack.empty() && stack.peek() == popA[j]) {
stack.pop();
j++;
}
}
3 栈为空说明就是, 否则不是.
return stack.empty();
}
}