队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
这次给大家介绍用线性表实现的队列,且不存在循环。
如图
这里介绍双向链表的常用操作:
创建队列
销毁队列
清空队列
入队
出队
返回队首元素
返回队的大小
返回队的最大长度
代码总分为三个文件:
LinkStack.h : 放置功能函数的声明,以及表的声明
LinkStack.c : 放置功能函数的定义
Main.c : 主函数,使用功能函数完成各种需求,一般用作测试
整体结构图为:
这里详细说下入队操作,出队操作和返回队首元素操作:
因为线性表的任意表元素可以直接获取,而且入队,出队都会移动表元素。且获取队首元素可以直接获取,不用进行遍历,所以表头作队头﹑队尾都可以,表尾同理。
OK! 上代码:
SeqQueue.h :
#ifndef _SEQQUEUE_H_
#define _SEQQUEUE_H_
typedef void SeqQueue;
SeqQueue* SeqQueue_Create(int capacity);
void SeqQueue_Destroy(SeqQueue* queue);
void SeqQueue_Clear(SeqQueue* queue);
int SeqQueue_Append(SeqQueue* queue, void* item);
void* SeqQueue_Retrieve(SeqQueue* queue);
void* SeqQueue_Header(SeqQueue* queue);
int SeqQueue_Length(SeqQueue* queue);
int SeqQueue_Capacity(SeqQueue* queue);
#endif
SeqQueue.c :
#include "SeqList.h"
#include "SeqQueue.h"
SeqQueue* SeqQueue_Create(int capacity)
{
return SeqList_Create(capacity);
}
void SeqQueue_Destroy(SeqQueue* queue)
{
SeqList_Destroy(queue);
}
void SeqQueue_Clear(SeqQueue* queue)
{
SeqList_Clear(queue);
}
int SeqQueue_Append(SeqQueue* queue, void* item)
{
return SeqList_Insert(queue, (SeqListNode*)item, SeqList_Length(queue));
}
void* SeqQueue_Retrieve(SeqQueue* queue)
{
return SeqList_Delete(queue, 0);
}
void* SeqQueue_Header(SeqQueue* queue)
{
return SeqList_Get(queue, 0);
}
int SeqQueue_Size(SeqQueue* queue)
{
return SeqList_Length(queue);
}
int SeqQueue_Capacity(SeqQueue* queue)
{
return SeqList_Capacity(queue);
}
Main.c :
#include <stdio.h>
#include "SeqQueue.h"
int main(void)
{
SeqQueue* queue = SeqQueue_Create(20);
int a[10];
int i = 0;
for(i=0; i<10; i++)
{
a[i] = i;
SeqQueue_Append(queue, a+i);
}
printf("Header: %d\n", *(int*)SeqQueue_Header(queue));
printf("Length: %d\n", SeqQueue_Size(queue));
printf("Capacity: %d\n", SeqQueue_Capacity(queue));
while(SeqQueue_Size(queue) > 0)
{
printf("%d ", *(int*)SeqQueue_Retrieve(queue));
}
printf("\n");
SeqQueue_Destroy(queue);
return 0;
}