一、括号匹配问题
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:(1)左括号必须用相同类型的右括号闭合。(2)左括号必须以正确的顺序闭合。注意:空字符串可被认为是有效字符串。
解题思路:遇到左括号就入栈,如果遇到右括号则取出栈顶元素,看看栈顶元素和当前元素是否匹配,如果字符串遍历完后,同时栈也为空,则为匹配的情况。
完整代码:
class Solution {
public boolean isValid(String s) {
//1.创建一个栈
Stack<Character> stack = new Stack<Character>();
//2.循环遍历每个字符
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
//3.如果是左括号就入栈
if(c=='(' || c=='[' || c=='{') {
stack.push(c);
continue;
}
//4.如果是右括号就取出栈顶元素
if(stack.isEmpty()) {
return false;
}
char top = stack.pop();
//5.检查当前元素是否匹配
if(top == '(' && c == ')') {
continue;
}
if(top == '[' && c == ']') {
continue;
}
if(top == '{' && c == '}') {
continue;
}
//三种情况都不符合则为非法情况
return false;
}
//6.判断栈是否为空
if(stack.isEmpty()) {
return true;
}
return false;
}
}
运行结果:
二、最小栈问题
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。push(x) -- 将元素 x 推入栈中。pop() -- 删除栈顶的元素。top() -- 获取栈顶元素。getMin() -- 检索栈中的最小元素。
解题思路:核心思路是空间来换时间,用额外空间把最小元素提前保存好,A用来存储栈中的数据,B专门用来存当前栈帧对应的最小元素。先把元素插入到A中,在把当前最小元素存放到B中,如果 B 不为空,当前B的栈顶元素就是之前的最小值,接下来把之前最小值与当前新元素进行对比,确定新的最小值。
注:当线程执行到某个方法时就会往方线程栈中压入一个帧,称为栈帧,栈帧中包含了方法的局部变量表、操作数栈、返回地址、动态连接等信息。
具体代码:
package package3;
import java.util.Stack;
public class MinStack {
// A 用来表示正常栈中的数据
// B 用来存储每一层 A栈帧中对应的最小值
private Stack<Integer> A = new Stack<>();
private Stack<Integer> B = new Stack<>();
public void push(int x) {
// 1. 先把元素插入到A中
A.push(x);
// 2. 把当前最小元素插入到B中
if (B.isEmpty()) {
B.push(x);
return;
}
// 如果 B 不为空,当前B的栈顶元素就是之前的最小值
// 之前最小值与当前新元素进行对比,确定新的最小值
int min = B.peek();
if (x < min) {
min = x;
}
B.push(min);
}
public void pop() {
if (A.isEmpty()) {
return;
}
A.pop();
B.pop();
}
public int top() {
return A.peek();
}
public int getMin() {
return B.peek();
}
}
运行结果: