一、队列的基本概念
队列是只允许在一端进行插入,在另一端删除的线性表
重要术语:队头、队尾、空队列
队列的特点:先进先出(FIFO)
二、队列的顺序实现
#define MaxSize 10
typedef struct{
ElemType data[MaxSize]; // 用静态数组存放队列元素
int front, rear; // 队头指针和队尾指针
}SqQueue;
// 初始化队列
void InitQueue(SqQueue &Q){
// 初始时队头、队尾指针指向0
Q.rear = Q.front = 0;
}
// 判断队列是否为空
bool QueueEmpty(SqQueue Q){
if(Q.rear == Q.front)
return true;
else
return false;
}
1. 入队操作
bool EnQueue(SqQueue &Q, ElemType x){
if((Q.rear + 1) % MaxSize == Q.front)
return false; // 队满报错
Q.data[Q.rear] = x; // 新元素插入队尾
Q.rear = (Q.rear + 1) % MaxSize; // 循环队列
return true;
}
2. 出队操作
bool DeQueue(SqQueue &Q, ElemType &x){
if(Q.rear == Q.front)
return false; // 队空报错
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize; // 循环队列队头指针后移
return true;
}
3. 查操作
bool GetHead(SqQueue &Q, ElemType &x){
if(Q.rear == Q.front)
return false; // 队空报错
x = Q.data[Q.front];
return true;
}
tip:可以借用size/tag变量来判断当前队列长度
三、队列的链式实现
typedef struct LinkNode{ // 链式队列结点
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{ // 链式队列
LinkNode *front, *rear; // 队列的队头和队尾指针
}LinkQueue;
// 初始化队列(带头节点)
void InitQueue(LinkQueue &Q){
// 初始时 front、rear 都指向头节点
Q.front = Q.rear = (LinkNode *) malloc(sizeof(LinkNode));
Q.front -> next = NULL;
}