【Java集合】栈

概念

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈

顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶

出栈:栈的删除操作叫做出栈。出数据在栈顶

特点:先进后出

我们可以把栈比作一个小盒子,元素比作比作小饼干,我们一个一个的放进小盒子,我们想吃的时候只能先吃上面的,然后才能吃到下面最开始放的。最先放进去的,最后吃到;最后放进去的,最先吃到。

栈的实现

  1. 利用顺序表实现,即使用尾插 + 尾删的方式实现

  2. 利用链表实现,则头尾皆可

相对来说,顺序表的实现上要更为简单一些,所以我们优先用顺序表实现栈。

public class MyStack { 
    // 简单起见,我们就不考虑扩容问题了 
    private int[] array = new int[100]; 
    private int size = 0; 
    //从栈顶放入元素
    public void push(int v) { 
        array[size++] = v; 
    }
    //从栈底弹出元素,并返回
    public int pop() { 
        return array[--size]; 
    }
    //返回栈底元素,不弹出
    public int peek() { 
        return array[size - 1]; 
    }
    //判断栈是否为空
    public boolean isEmpty() { 
        return size == 0; 
    }
    //返回栈的大小
    public int size() { 
        return size; 
    } 
}

常用方法

方法 解释
E push(E item) 压栈
E pop() 出栈
E peek() 查看栈顶元素
boolean empty() 判断栈是否为空

栈相关的题

LeetCode 20.有效的括号

【Java集合】栈_第1张图片

分析题目:

匹配题,用栈可以解决。通过题目,我们需要将括号左半部分放入栈中和后面的字符进行匹配,因为栈的特点是先进后出,所以栈顶元素永远是最后放入的元素,根据这个,我们得知可以通过peek()方法与字符进行匹配,如果匹配成功就返回true,不成功返回false。

故有三种情况:

  1. 匹配成功,最后所有的字符全部遍历结束,栈为空。
  2. 左括号比右括号多,遍历结束后,发现栈不为空。
  3. 右括号比左括号多,在遍历过程中,发现栈为空,但是遍历没有结束。

代码演示

class Solution {
    public boolean isValid(String s) {
        //定义一个栈,栈中保存字符类型
        Stack<Character> stack = new Stack<>();
        for(int i=0; i <s.length();i++) {
            char ch = s.charAt(i);
            //将所有左括号放入栈中
            if(ch == '(' || ch == '[' || ch == '{') {
                 stack.push(ch);
            }else{
                //ch不是左括号情况
                //栈为空,但是遍历没有结束,说明右括号比左括号多
                if(stack.empty()) {
                    return false;
                }
                char top = stack.peek();
                //ch和栈顶元素匹配时,弹出栈顶元素
                if(top == '(' && ch == ')' || top == '{' && ch == '}' || top == '[' && ch == ']' ){
                    stack.pop();
                }else{
                    return false;
                }
            }
        }  
        //循环结束,栈不为空,表示左括号比右括号多
        if(!stack.empty()) {
            return false;
        }
        return true;
    }
}

你可能感兴趣的:(数据结构和算法,java,leetcode)