有效的括号

在这里插入图片描述

题解

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;
    }
}

总结:
栈数据结构

  1. 线性结构:栈是一种特殊的线性表,只能对栈顶元素进行操作
  2. 内部有序:入栈元素按照顺序存储在栈空间中 ,后进先出结构
  3. 线程安全:只有在对栈顶元素操作成功的情况下,才可以进行下一步操作
  4. 主要方法

构造方法
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 的方法,返回相应位置的元素——最后一个元素 的值
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值