一、队列的定义和特点
1) 队列是一种先进先出的线性表;在表一端插入(表尾),在另一端(表头)删除
2) 队列的逻辑结构: 与线性表相同,仍为一对一关系
3) 队列的存储结构: 顺序存储或链式存储
4) 插入元素称为入队;删除元素称为出队
5) 解决假上溢的方法---引入循环队列
arr[0]接在arr[SZIE-1]之后,若rear+1==SIZE,则令rear=0
实现方法: 利用取模运算
插入元素: Q.arr[Q.rear] = x;
Q.rear = (Q.rear+1)%SIZE;
删除元素: x = Q.arr[Q.front];
Q.front = (Q.front+1)%SIZE;
6) 循环队列解决队满时判断方法----少用一个元素空间
队空: front == rear
队满: (rear+1)%SIZE == front
二、顺序(循环)队列的表示及操作
1.顺序队列的表示
#define SIZE 10 //最大队列长度
typedef int Datatype;
typedef struct
{
Datatype *arr; //初始化的动态分配存储空间
int front; //队头元素的下标
int rear; //指向队列尾元素的下一个位置
}SqQueue;
2.队列的初始化
void InitQueue(SqQueue *p) //队列的初始化
{
p->arr = (Datatype*)malloc(SIZE* sizeof(Datatype)); //分配数组空间
if (!p->arr) //判断分配是否成功
{
printf("内存分配失败!\n");
return;
}
p->front =p->rear= 0; //队头队尾下标置0,队列为空
}
3.求队列长度
int GetLength(SqQueue *p) //求队列长度
{
return ((p->rear - p->front + SIZE) % SIZE); //一定要取余(不取余队列为空时计算出错)
}