浅谈栈(Stack)数据结构

本文介绍了栈(Stack)的基本概念、特征,如后进先出(LIFO)的性质,以及栈在撤销操作、程序调用和括号匹配等场景中的应用。还探讨了如何通过Java的`java.util.Stack`以及自定义`ArrayList`和`LinkedList`实现栈数据结构。
摘要由CSDN通过智能技术生成

一、概述:

栈(stack):栈是一种线性的结构,这种数据结构仅限在线程表的一段进行插入和删除操作。其中线性表插入的和删除的一段称为栈顶(top),不循序插入和删除的一段称为栈底(bottom)。所以栈数据结构是遵循“后入先出”,也就是“LIFO”。

二、栈的特征

(1)栈也是一种线性的机构。

(2)相比较数组,占对应的操作是数组的子集。

(3)只能从一端添加元素,也只能从一端取出元素,这一端称为栈顶。

(4)栈是一种后进先出的数据结构。称为:Liast In First Out(LIFO)

三、栈的应用:

(1)无处不在的Undo操作(撤销)。

(2)程序调用的系统栈。

(3)括号匹配-编译器

通过java.util.Stack来实现一个括号匹配器:

public class Solution {

    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i=0; i< s.length();i++){
            char c = s.charAt(i);
            if(c == '(' || c == '[' || c == '{')
                stack.push(c);
            else{
                if(stack.isEmpty())
                    return false;

                char topChar = stack.pop();
                if(c == ')' && topChar != '(')
                    return false;
                if(c == ']' && topChar != '[')
                    return false;
                if(c == '}' && topChar != '{')
                    return false;
            }
        }
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        System.out.println((new Solution()).isValid("()[]{}"));
        System.out.println((new Solution()).isValid("()[]{]}"));
    }

}

java.util.Stack这个栈数据结构得底层是通过java.util.Vector实现的,Stack继承了Vector,而Vector和ArrayList一样实现了List接口,Vector和ArrayList是实现原理上是非常相似的,它们都是通过数组实现的,不过与ArrayList不同的是,Vector支持线程的同步,即某一个时刻只有一个线程能够操作Vector,避免了多线程同时引起的不一致性,它的同步是通过synchronized实现的,同步需要很高的花费,访问它要比访问ArrayList要慢;Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

四、栈的实现:

(一) 通过自定义ArrayList封装一个栈数据结构:

1、定义Stack接口:

public interface Stack<E> {

    //查看栈元素的数量
    int getSize();

    //查看栈元素是否为空;
    boolean isEmpty();

    //压栈
    void push(E e);

    //弹出
    E pop();

    //查看栈顶元素
    E peek();
}

2、创建自定义ArrayList

public class CustomArray<E> {

    //private int[] data;
    private E[] data;

    private int size;

    //构造函数,出入数组的容量capocity构造CustomArray
    public Cus
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值