Chapter3-栈和队列
1.栈和队列是两种常用的线性存储表。
2.都限定关于插入和删除元素的操作在表的端点进行。栈只能在栈顶进行操作,队列仅能在队首和队尾进行操作。
3.1 栈
3.1.1 栈的基本概念
1.只允许在一段插入和删除元素的线性表。
2.允许插入和删除元素的一段成为栈顶top
,另一端成为栈底bottom
.
3.遵循后进先出(LIFO)规则。
3.1.2 顺序栈——栈的数组表示
在实现过程中主要通过向数组中依次插入元素即可(前提是不溢出)。需要注意的是:**因为采用数组的时候必须指定一个特定的大小size
,则需要一个技术器count
来根据插入和删除元素的情况进行判断是否溢出。同时这也是循序栈的一个缺点。
3.1.3 链式栈
1.借助链表的方式解决了顺序栈空间不足的问题,可以根据实际需求进行动态扩容。
2.在实现过程中与单链表的实现方式类似。栈底的后继是NULL
,在栈顶需要一个top
指针指向栈顶元素。
3.2 队列
3.2.1 队列的基本概念
1.队列是只允许在一端对头front
删除,一端插入队尾rear
的线性表。
2.遵循先进先出(FIFO)规则。
3.2.2 链队列
链式队列在入队是无队满的问题,但有队空的问题。队空的条件为:
front == rear
3.2.3 循环队列——队列的顺序存储结构
相较于链队列,循环队列的入队和出队规则以及状态判定都要变得更为复杂一些:
1.顺序队列的入队和出队原则
(1)入队时将新元素按rear
指示位置加入再将队尾rear
自加一:rear = rear + 1
(2)出队时将下表为front
的元素去除,再将对头front
自加一:front = front + 1
(3)队满时再入队将溢出错误。
(4)队空时再出队将队空处理。
(5)解决假溢出方法:将队列元素存放数组首位相连,形成循环队列。
2.循环队列的计算判断
对头front
和队尾rear
自加一时从maxSize - 1
直接进到0,可用mod运算实现:
(1)对头front
自加一:front = (front +1) % maxSize
.
(2)队尾rear
自加一:rear = (rear + 1) % maxSize
.
(3)队列初始化:front == rear == 0
.
(4)队空条件:count == 0
.
(5)队满条件:count == maxSize
.