栈和队列是两种重要的线性结构,从数据结构来看,他们也是线性表,其特殊性在于它们的基本操作是线性表的子集,也就中功能受限的线性表,也被称为限定性的数据结构。
但从数据类型角度来看,它们是和线性表不大相同,有些时候它们被当作一种管理数据的规则。
栈结构
1、栈结构介绍
栈(stack) 是限定仅在表尾进行插入或删除操作和线性表(只有一端口能进出数据),对栈来说表尾和表头有特殊含义,表尾被称为栈顶,表头被称为栈底,没有元素的空表称为空栈,元素数量达到栈的容量称为满栈,数据添加到栈中叫入栈、压栈,数据从栈中删除叫出栈、弹栈,由于栈元素特殊添加和删除的规则,所以栈的元素会先进后出的现象,简称为LIFO(Last in first out)。后进先出(FILO);
2、栈结构所具备的功能
1、创建栈
2、销毁栈
3、栈是否为空
4、栈是否为满
5、入栈
6、出栈
8、查看栈顶元素
9、栈元素数量
注:只有顺序栈结构才有需要判断栈是否满。
栈的应用
1、内存管理,比如栈内存,它所以叫栈内存就是因为它遵循着栈的后进先出的规则,它支持着函数调用,函数在传参数就是把参数先压入到栈内存,等跳转过去后再把参数从栈内存弹出。
2、特殊的算法,例如:进制转换、表达式解析、迷宫求解。
队列
1、队列介绍
它与栈刚好相反,是一种先进先出的线性表,它有两个端口添加、删除元素,一个端口只能添加元素,被称为入队,该端口被为队尾,另一个端口只能删除,被称为出队,该端口被称为队头。
2、队列结构所具备的功能
1、创建队列
2、销毁队列
3、队列是否为空
4、队列是否为满
5、入队
6、出队
8、查看队头元素
9、查看队尾元素
10、队列元素数量
注:只有顺序栈结构才有需要判断队列是否满。
顺序队列的表示与实现
顺序栈的栈顶下标会随着元素入栈增大,元素出栈减小,从而让空间重复使用,而顺序队列的队头指针和队尾指针,会随着元素的入队出队一直增加,无法重复使用,而形成一次性的数据结构。
为了避免这种情况,当队头下标的队尾下标到达存储空间的末尾时,要想办法把队头下标的队尾下标"回头",就是把顺序队列的存储空间当作一个"环形",循环使用,所以顺序队列也叫循环队列。
带计数器版本的循环队列:
1、解决了计算元素数量的问题
2、解决了判断队列空、满状态的问题
3、缺点就是增加了一个成员,在创建、入队、出队时都要操作它。
如何判断队列空、状态?
把队头下标初始化为front=0,队尾下标也初始化rear=0,队列空时的判断条件是front == rear,但随机队列的使用,队列满时的判断也是front == rear。
解决方法就是把队列的最后一个位置空置不使用,这样队列满的状态front == (rear+1)%cap;