队列(Queue):具有一定操作约束的线性表
特点:FIFO
即先来先服务,只能在一端插入,在另一端删除
顺序存储实现:由一个一维数组和一个记录头元素位置的变量front以及一个记录队尾元素位置的变量rear组成
#define Maxsize <存储数据元素的最大个数>
struct QNode{
ElementType Data[Maxsize];
int rear;
int front;
};
typedef struct QNode * Queue;
队列相关操作
一、入队和出队操作
//入队
void ADDQ(Queue PtrQ,ElementType item){
if(PtrQ -> rear + 1) % Maxsize == PtrQ -> front){
printf("队满!");
return ;
}
PtrQ -> rear = (PtrQ -> rear + 1) % Maxsize;
PtrQ -> Data[PtrQ -> rear ] = item;
}
//出队
ElementType DeleteQ(Queue PtrQ){
if(PtrQ -> front == PtrQ -> rear){
printf("队空");
return error;
}
else{
PtrQ -> front = (PtrQ -> front + 1) % Maxsize;
return PtrQ -> Data[PtrQ -> front];
}
}
队列的链式存储实现:
用一个单链表实现,插入和删除操作分别在两头进行,队列指针front和rear分别指向队首和队尾
其中front指向队头节点,rear指向队尾节点,即在头出,尾插
struct Node{
ElementType Data;
struct Node *Next;
};
struct QNode {
struct Node *rear;
struct Node *front;
};
typedef struct QNode *Queue;
Queue PtrQ;
相关操作:不带头节点的链式队列出队
ElementType DeleteQ(Queue PtrQ){
struct Node *FrontCell;
ElementType FrontElem;
if(PtrQ -> front == NULL){
printf("队列空");
return error;
}
FrontCell = PtrQ -> front;
if(PtrQ -> front == PtrQ -> rear){
PtrQ -> front = PtrQ -> raer = NULL;
}
else{
PtrQ -> front = PtrQ -> front -> Next;
}
FrontElem = FrontCell -> Data;
free(FrontCell);
return FrontElem;
}