1、栈的基本概念
栈是一种数据结构,它代表只能在某一段进行插入、删除操作的特殊线性表,通常就是在线性表的末端进行插入、删除操作。
归纳起来就是:栈就是一种后进先出的线性表
2、栈提供的基本方法
栈不允许提供从中间任意位置访问元素的方法,栈只允许在栈顶插入、删除元素
初始化:通常是一个构造器,用于创建一个空栈
返回栈的长度、入栈、出栈、访问栈顶元素、判断栈是否为空、清空栈
3、顺序栈的实现和方法实现
顺序栈利用一组地址连续的存储单元依次存放从栈底到栈顶的数据元素。栈底位置固定不变,它的顶栈元素可以直接通过栈底层数组的元素访问ar[size-1]。
进栈:只需将新的数据元素存入栈内,然后再记录栈内元素个数的变量+1,程序即可再次通过arr【size-1】重新访问新的栈顶元素。
出栈:让记录栈内元素个数的变量减1;释放数组对栈顶元素的引用。
4、链式栈的实现和方法实现
栈顶元素不断改变,程序只要使用一个top引用来记录当前的栈顶元素,top引用变量永远引用栈顶元素,再使用一个size变量记录当前栈中包含多少元素即可。
进栈:让top引用指向新添加的元素,新元素的next引用指向原来的栈顶元素。让记录栈内元素个数size变量+1.
出栈:让top引用指向原栈顶元素的下一个元素,并释放原来的栈顶元素。
5、Java集合框架提供的栈
java.utill.Stack:它就是一个普通的顺序栈,底层基于数组实现,线性安全,在多线程环境下可安心使用
java.util.LinkedList:LinkedList是一个双向链表,但它提供了push(),pop(),peek()等方法,这表明LInkedList可以但成栈来使用。但是线性不安全,如果在多线程环境下使用,应该使用Collections类将其改造成线性安全。
6、队列的基本概念
队列是一种被限制的线性表,它使用固定的一段来插入数据,另一端来删除数据,也就是说,队列中元素的移动方向是固定的。
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,在表的后端进行插入操作,进行插入的端称为队尾,进行删除的端称为对头。
7、队列提供的基本方法
初始化:通常是一个构造器,用于创建一个空队列
返回队列的长队:返回队列中数组元素的长度
加入元素:向队列的rear端插入一个数据元素,队列长度+1
删除元素:从队列的front端删除一个数据元素,队列长度-1,返回被删除的元素
访问队列的前端元素:
判断队列的前端元素是否为空
清空队列
8、顺序队列的实现和方法实现
系统采用一组地址连续的存储单元存放队列从rear到front端的所有数据元素,程序只需front和rear俩个整形变量来记录front端的元素索引、rear端的元素索引。对于顺序队列而言,队列底层将采用数组来保存队列元素,每个队列元素在数组中的位置是固定不变的,变的只是rear和front整形变量。当r元素进入队列时,rear值+1,当有元素从队列中移除时,front变量+1.
对于链栈而言,栈内包含几个元素,底层链式结构只需保存几个节点,每个节点需要添加一个next引用,这会引起部分空间的浪费。对于顺序栈来说,程序开始就需要开辟一块连续的内存。从空间利用率来看,链栈的空间利用率比顺序栈的空间利用率更高一些。
9、循环队列
为了重新利用顺序队列底层数组中已删除元素所占用的空间,消除可能出现的“假满”现象,可将顺序队列改为循环队列,循环队列是首位相连的队列;当front、rear变量达到底层数组的capacity-1之后,再前进一位自动变成0.
对于front==rear这种情况,如果底层数组为null,表明队列为空,否则为满。
10、链式队列的实现和方法实现
采用链式存储结构的队列也被称为链队列,对于链队列而言,由于程序需要从rear端添加元素,从front端移除元素,因此考虑对链队列增加front、rear俩个引用变量,使它们分别指向链队的头、尾俩个节点
11、Java集合框架提供的队列
Java提供的Queue接口代表一个队列。其包含6个方法用于队列的插入移除和访问
12、双向队列(deque)
两端同时进行插入和删除操作。