队列
队列是限制在两端进行插入操作和删除操作的线性表
允许进行存入操作的一端称为“队尾
”
允许进行删除操作的一端称为“队头
”
当线性表中没有元素时,称为“空队”
特点 :先进先出(FIFO)
队列常用操作函数
- 创建队列 :queue_create();
- 清空队列 :queue_clear(sequeue *sq);
- 判断队列空 :queue_empty(sequeue *sq);
- 判断队列满 :queue_full(sequeue *sq);
- 入队 :enqueue(sequeue *sq, datatype x);
- 出队 :dequeue(sequeue *sq);
- 释放队列内存:queue_free(sequeue *sq);
队列实现结构体
typedef int data_t ; /*定义队列中数据元素的数据类型*/
#define N 64 /*定义队列的容量*/
typedef struct {
data_t data[N] ; /*用数组作为队列的储存空间*/
int front, rear ; /*指示队头位置和队尾位置的指针*/
} sequeue ; /*顺序队列类型定义*/
队列演示
规定:
- front指向队头元素的位置;
- rear指向队尾元素的下一个位置。
- 在队列操作过程中,为了提高效率,以调整指针代替队列元素的移动,并将数组作为循环队列的操作空间。
- 为区别空队和满队,满队元素个数比数组元素个数少一个。
顺序队列为什么要采用循环的方式?
为了避免顺序队列产生假溢出。
假溢出:
顺序队列因多次入队知列和出队列操作后出现的有存储空间但不能道进行入队列操作的溢出称为假溢出;
真溢出:
在顺序队列中,由于数组空间不够而产生的溢出叫真溢出;
循环队列如何判断空和满?
- 队头指针在队尾指针的下一位置时,队满。
- 当队头和队尾指针在同一位置时,队空。
``
sequeue.h
typedef int datatype;
#define N 128
typedef struct {
datatype data[N];
int front;
int rear;
}sequeue;
sequeue * queue_create();
int enqueue(sequeue *sq, datatype x);
datatype dequeue(sequeue *sq);
int queue_empty(