队列
队列的概念
队列(Queue):具有一定操作约束的线性表
- 插入和删除操作:只能在一端插入,而在另一端删除。
- 数据插入:入队列(AddQ)
- 数据删除:出队列(DeleteQ)
- 先来先服务
- 先进先出
队列的抽象操作数据类型描述
类型名称:队列(Queue)
数据对象集:一个有0个或多个元素的有穷线性表
操作集:长度为MaxSize的队列Q ∈ \in ∈Queue,队列元素item ∈ \in ∈int
队列的基本操作主要有:
Queue initQueue(int MaxSize)
:生成长度为MaxSize的空链表int isFull(Queue Q)
:判断队列Q是否已满void AddQ(Queue Q ,int item)
:讲数据元素item插入队列Q中int isEmpty(Queue Q)
:判断队列Q是否为空int DeleteQ(Queue Q)
:将队头数据元素从队列中删除并返回
1.循环队列的顺序存储实现
队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量 front 以及一个记录队列尾元素位置的变量 rear 组成,其中 front 指向整个队列的头一个元素的再前一个,rear 指向的是整个队列的最后一个元素,从 rear 入队,从 front 出队,且仅使用 n-1 个数组空间
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct QNode {
int Data[MaxSize];
int front; //记录队头
int rear; //记录队尾
}*Queue;
Queue initQueue() //初始化
{
Queue Q;
Q = (Queue)malloc(sizeof(struct QNode));
Q->front = -1;
Q->rear = -1;
return Q;
}
// 判断队列是否已满
int IsFull(Queue Q)
{
return ((Q->rear+1)%MaxSize == Q->front);
}
//入队
void AddQ(Queue Q,int item)
{
if(IsFull(Q))
{
printf("队列满");
return ;
}
else
{
Q->rear = (Q->rear+1)%MaxSize;
Q->Data[Q->rear] = item;
}
}
//判断队列是否为空
int IsEmpty(Queue Q){
return (Q->front == Q->rear);
}
//出列
int DeleteQ(Queue Q)
{
if(IsEmpty(Q))
{
printf("队列空");
}
else
{
Q->front = (Q->front+1)%MaxSize;
return Q->Data[Q->front];
}
}
2.队列的链式存储实现
队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行,front 在链表头,rear 在链表尾,从 rear 入队,从 front 出队
#include<stdio.h>
#include<stdlib.h>
struct Node{
int Data;
struct Node *Next;
};
typedef struct QNode{
struct Node *rear; //指向队尾结点
struct Node *front ; //指向队头结点
}*Queue;
/* 初始化 */
Queue initQueue()
{
Queue Q;
Q = (Queue)malloc(sizeof(struct QNode));
Q->front=NULL;
Q->rear=NULL;
return Q;
}
/* 判断是否为空 */
int IsEmpty(Queue Q)
{
return (Q->front == NULL);
}
/* 入队 */
void AddQ(Queue Q,int item)
{
struct Node * node ; //建立一个结点
node = (struct Node*)malloc(sizeof(struct Node)); //为node分配空间
node->Data = item; //给node的数据域添加元素
node->Next = NULL;
if(Q->rear == NULL){ //此时队列为空
Q->rear = node;
Q->front = node;
}
else { //不为空
Q->rear->Next = node ; //将结点入列
Q->rear = node ; //rear 仍然保持最后
}
}
/* 出列 */
int DeleteQ(Queue Q)
{
struct Node * temp;
int key;
if(IsEmpty(Q))
{
printf("队列空");
return 0;
}
temp = Q->front;
if(Q->front == Q->rear) { //队列中只有一个元素
Q->front = Q->rear = NULL;
}
else{
Q->front=Q->rear->Next;
}
key = temp->Data;
free(temp);
return key;
}