29、栈和队列

来源:互联网 发布:网络组策略 编辑:程序博客网 时间:2024/06/06 09:19
1、栈

栈(Stack)是一种特殊的线性表,只能在固定一端进行插入、删除操作,通常在线性表的尾端进行操作。

从功能上来看,栈比普通线性表的功能更弱;栈是一种被限制过和线性表,只能从栈顶进行操作。

1.1、顺序栈和链栈

        存取效率:由于栈不需实现随机存取功能,只需从栈顶插入、删除操作,因此顺序结构所提供的高效存取就没有太大的价值。采用链式结构的实现,程序同样可以高效地出栈、入栈。

        空间利用率:链栈内保存几个元素,链式结构就需保存几个节点,每个节点都需额外添加一个next引用,会占用部分空间。对于顺序栈,程序开始就需要在底层开辟一块连续的内存空间(数组),这种空间浪费其实更大。链栈的空间利用率比顺序栈更高。

1.2、JAVA集合中的栈

        java.util.Stack:最普通的栈,底层基于数组实现,是线程安全的,在多线程环境下也可放心使用。

        java.util.LinkedList:双端链表,也可作为栈(链式)使用。线程不安全,如果需要在多线程环境下使用,则应该使用Collections类的工具方法将其“改造”成线程安全的类。

2、队列

队列(Queue)是另一种被限制过的线性表。只允许在表的前端(front、队头)进行删除操作,在表的后端(rear、队尾)进行插入操作。

2.1、顺序队列和链式队列

        顺序队列:顺序队列会存在“假满”的情况,采用循环队列可解决这个问题。

        链式队列:链式队列允许添加无限多个数据元素,不存在队列满的问题。

2.2、JAVA集合中的队列

        java集合框架中提供了一个Queue接口,该接口代表了一个队列,实现该接口的类可以当成队列使用。

3、双端队列

        双端队列(Deque)是Queue的子接口,也是Stack的子接口。因此,Deque既可以当成队列使用,也可当成栈使用。推荐使用Deque实现类作为“栈”使用。

        LinkedList也可作为线程安全的、链式结构的双端队列,几乎是java集合框架中方法最多的类。



0 0
原创粉丝点击