Skip to content

Chapter 03 栈和队列

1. 栈

后进先出, Last-In First-Out

1.1 顺序栈

使用向量实现

上溢(Overflow)

当栈中已经有maxsize个元素时,如果再做进栈操作,所产生的“无空间可用”现象

下溢(Underflow)

空栈进行出栈所产生的“无元素可删”现象

1.2 链式栈

用单链表实现

1.3 顺序栈与链式栈的比较

时间效率:

  • 所有操作都只需常数时间
  • 顺序栈和链式栈在时间效率上难分伯仲

空间效率:

  • 顺序栈须说明一个固定的长度
  • 链式栈的长度可变,但增加结构性开销

实际应用中,顺序栈比链式栈用得更广泛些

2. 队列

队列是只允许在一端删除,在另一端插入的线性表

允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)

特性: 先进先出(FIFO, First In First Out)

2.1 顺序队列

使用顺序表实现

用向量存储队列元素,用两个变量分别指向队列的前端(front)和尾端(rear)

front:指向当前待出队的元素位置(地址)

rear: 指向当前待入队的元素位置(地址)

上溢

当队列满时,再做进队操作,所出现的现象

下溢

当队列空时,再做删除操作,所出现的现象

假溢出

当 rear = mSize-1 时,再作插入运算就会产生溢出,如果这时队列的前端还有许多空位置,这种现象称为假溢出

2.2 循环队列

若简单使用 front == rear 判断, 无法区分队空与队满两种状态.

解决方法: 浪费一个存储空间, 以区别队空与队满. 即使用 size+1 个空间, 若 (rear+1) % maxsize == front 说明队满. (也可以使用计数器法, 统计当前入队的元素个数)

2.3 链式队列

单链表队列:链接指针的方向是从队头指向队尾

队头在链头,队尾在链尾

链式队列在进队时无队满问题,但有队空问题

队空条件: front == rear ==NULL