队列是一种特殊的线性表,对队列的操作具有一定的约束,一般来说,队列只能允许在一端删除元素,在另一端插入元素,就比如食堂打饭排队,具有先来先服务的特征。队列的存储同样有两种方法,顺序存储和链式存储。
1、队列的顺序存储实现
(1)数据结构
typedef struct{
int Data[MAXSIZE];
int rear;
int front;
}Queue;
(2)对队列操作函数
bool isEmptyQ(Queue *q); --判断队列是否为空
bool isFullQ(); --判断队列是否满
Queue* createQueue(); --创建一个空队列
void AddQ(Queue* q,int elem); --向队列里面增加元素
int DeleteQ(Queue* q); --删除队列元素
(3)实现代码
bool isEmptyQ(Queue *q)
{
if(q->front==q->rear)
return true;
else
return false;
}
bool isFullQ(Queue *q)
{
if((q->rear+1)%MAXSIZE==q->front)
return true;
else
return false;
}
Queue* createQueue()
{
Queue *q;
q=(Queue*)malloc(sizeof(Queue));
q->front=q->rear=0;
return q;
}
void AddQ(Queue* q,int elem)
{
if(isFullQ(q))
{
printf("the queue is full\n");
return ;
}
else
{
q->rear=(q->rear+1)%MAXSIZE;
q->Data[q->rear]=elem;
}
}
int DeleteQ(Queue* q)
{
if(isEmptyQ(q))
{
printf("the queue is empty\n");
}
else
{
q->front=(q->front+1)%MAXSIZE;
return q->Data[q->front];
}
return 0;
}
int main()
{
Queue *q=createQueue();
int i=0;
for(i=0;i<MAXSIZE-1;i++)
{
AddQ(q,i+10);
}
for(i=1;i<q->rear+1;i++)
printf("%d ",q->Data[i]);
int ret=DeleteQ(q);
printf("\n出队列1次\n");
printf("%d ",ret);
ret=DeleteQ(q);
printf("\n出队列2次\n");
printf("%d ",ret);
return 0;
}
2、队列链式存储实现
(1)数据结构
typedef struct Node{
int data;
struct Node* next;
}QNode;
typedef struct{
QNode* front;
QNode* rear;
}Queue;
(2)对队列操作函数接口
bool isEmptyQ(Queue *q); --判断队列是否为空
Queue* createQueue(); --创建一个空队列
void AddQ(Queue* q,int elem); --向队列里面增加元素
int DeleteQ(Queue* q); --删除队列元素
(3)代码实现
bool isEmptyQ(Queue *q)
{
if(q->front==NULL && q->rear==NULL)
return true;
else
return false;
}
void createQueue(Queue* q)
{
q->front=NULL;
q->rear=NULL;
}
void AddQ(Queue* q,int elem)
{
QNode *Backcell;
Backcell=(QNode*)malloc(sizeof(QNode));
Backcell->data=elem;
Backcell->next=NULL;
if(isEmptyQ(q))
{
q->front=Backcell;
q->rear=Backcell;
}
else
{
q->rear->next=Backcell;
q->rear=Backcell;
}
}
int DeleteQ(Queue* q)
{
int elem;
QNode* Node;
Node=q->front;
elem=Node->data;
if(isEmptyQ(q))
{
printf("the queue is empty\n");
}
else
{
q->front=Node->next;
free(Node);
return elem;
}
}
//测试代码
int main()
{
Queue *q;
int i;
q=(Queue*)malloc(sizeof(Queue));
createQueue(q);
printf("入队顺序:\n");
for(i=0;i<10;i++)
AddQ(q,i);
QNode *p=q->front;
for(i=0;i<10;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n出队顺序\n");
for(i=0;i<10;i++)
{
int ret=DeleteQ(q);
printf("%d ",ret);
}
return 0;
}