括号匹配问题
-
情景:
-
给定一个字符串,仅包含"("、")"、"["、"]"等字符,要求如下:
-
如果该字符中的左括号与右括号连续且成对出现,则说明该字符串有效,如下:
String str = "(){}[]" // 有效字符串
-
实现一个算法,判断该字符串是否有效
-
实现思路:
-
构造一个HashMap,将左右括号以键值对形式存放进去
-
构造一个栈Stack
-
依次遍历字符串中的字符s,如果存在Map中的key值与s相等,则入栈
-
如果该字符s不是key值,即不是左括号,则Stack出栈,计算value值是否与s相等
-
不相等则说明括号不连续或不成对,该字符串是无效的
-
-
这里利用的是栈的特性:先进先出,用来判断括号是否连续且成对(2023/08/26午)
-
具体代码实现:
/**
* 括号匹配问题
*
* @param s
* @return
*/
static boolean isValid(String s) {
if (s.length() <= 1) {
return false;
}
// 1.构造HashMap
Map<Character, Character> smap = new HashMap<>();
smap.put('(', ')');
smap.put('{', '}');
smap.put('[', ']');
// 2.构造栈
Stack<Character> stack = new Stack<>();
// 3.遍历字符串
for (int i = 0; i < s.length(); i++) {
char item = s.charAt(i);
// 入栈左括号
if (smap.containsKey(item)) {
stack.push(item);
//入栈右括号
} else {
if (stack.isEmpty()) {
return false;
}
Character left = stack.pop();
char rightChar = smap.get(left);
if (rightChar != item) {
return false;
}
}
}
//
return stack.isEmpty();
}
最小栈
-
实现快速获取栈中的最小元素
-
我们设计这样一个数据结构:
-
构建两个栈,一个栈存放入栈元素,另一个栈存放栈顶元素对应的此时栈中最小的元素
-
即最小栈中的栈顶,始终维护栈中的最小元素(2023/08/26午)
-
具体代码如下:
/** * 最小栈 */ 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) { 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(); } }
-
最大栈
-
思路与最小栈基本一致
通关(过关挑战)
-
这是要求:
给你一个栈,依次入栈1 2 3 4,请问以下出栈顺序可能出现吗?为什么?
-
我们解释两个例子吧:(2023/08/26午)
出栈顺序:2 3 4 1 √ 先出栈2,必然是1已经入栈了,再入栈3、出栈3,入栈4、出栈4,最后出栈1,没有问题
出栈顺序:1 4 2 3 × 先入栈1、出栈1,要出栈4,必然是2 3 4依次入栈了,出栈4之后的出栈顺序只能是3 2,而不可能是2 3,故错误
-
多做这样的例子,你就能彻底明白栈这个数据结构了:先进先出