题解
class Solution {
public boolean isValid(String s) {
// 使用栈数据结构来解决这道题
Stack<Character> stack = new Stack<>();
// 将字符串转为字符数组,依次进栈
char[] charArray = s.toCharArray();
for(char c : charArray){
// 如果栈为空则,push进栈
// 如果栈不为空,则判断要进栈的元素和栈顶元素是否匹配
// 如果匹配则pop弹出栈顶元素
// 不匹配则继续进栈
// 最后判断栈是否为空,为空则表示全部匹配成功
if(stack.size()==0){
stack.push(c);
}else if(isMatch(stack.peek(),c)){
stack.pop();
}else{
stack.push(c);
}
}
return stack.size() == 0;
}
// 判断两个符号是否匹配
public boolean isMatch(char c1,char c2){
if((c1=='('&&c2==')') ||(c1=='{'&&c2=='}') || (c1=='['&&c2==']')){
return true;
}else
return false;
}
}
总结:
栈数据结构
- 线性结构:栈是一种特殊的线性表,只能对栈顶元素进行操作
- 内部有序:入栈元素按照顺序存储在栈空间中 ,后进先出结构
- 线程安全:只有在对栈顶元素操作成功的情况下,才可以进行下一步操作
- 主要方法
构造方法
Stack 只有一个构造方法,用于初始化一个栈结构的对象。初始化之后的栈,其中不包含任何项。
public Stack(){
}
在对 Stack 进行初始化的时候,我们可以为它设定一个泛型,如
Stack<String> stack = new Stack<>();
//Stack<E> stack = new Stack<>();
//我们要注意的是,因为Vector类中要求其内容不可以为基本数据类型,所以在 Stack 的构造方法中也有这样的约定。
进栈 – push(E e)
// Stack
public E push(E item) {
addElement(item); //底层实现就是Vector.addElement(E)方法~
return item;
}
// Vector
public synchronized void addElement(E obj) {
modCount++; //用于 迭代器 -- 迭代过程中不可以操作元素
ensureCapacityHelper(elementCount + 1); //扩容
elementData[elementCount++] = obj; //将Vector的最后一个元素设定为obj
}
出栈 – pop()
public synchronized E pop() {
E obj;
int len = size(); //size() 方法实际上是将栈中的元素数量返回,并赋值给 len.
obj = peek(); //调用 peek()方法,将栈顶元素返回
removeElementAt(len - 1); //调用Vector.removeElementAt(int index)方法
return obj;
}
//Vector.removeElementAt(int index) 方法
//其中 index < 0 || index >= size() 不然会抛出异常
public synchronized void removeElementAt(int index) {
modCount++;
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
//以上都为异常情况
int j = elementCount - index - 1;
//正常情况下 j = elementCount - (len - 1) - 1=len - len + 1 - 1 = 0
if (j > 0) { //如果 j > 0 ,表示传入参数的 len 要小于Vector中的元素数量,那么就将原来index(len - 1)位置下的元素去除。
System.arraycopy(elementData, index + 1, elementData, index, j);
} // Java 工程师采用队列复制的方法,将index位置下的数据去除。
elementCount--; //线性表中元素数量-1
elementData[elementCount] = null; //将线性表的最后一个元素设定为null~,即去除栈顶元素
}
peek() 返回值 栈顶元素但不删除
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException(); //空栈,抛出异常
return elementAt(len - 1); // Vector 的方法,返回相应位置的元素——最后一个元素 的值
}