队列的顺序存储设计与实现
1、概念
队列是一种特殊的线性表;队列仅在线性表的两端进行操作;对头(Front)是取出元素的一端;队尾(Rear)是插入数据元素的一端;队列不允许在中间部位进行操作。
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
2、队列模型与链表模型的分析
3、代码实现
(1)seqqueue.h
#ifndef _MY_SEQQUEUE_H_
#define _MY_SEQQUEUE_H_
typedef void SeqQueue;
SeqQueue* SeqQueue_Create(int capacity);
void SeqQueue_Destory(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
(2)seqqueue.c(seqlist.h链接)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "seqqueue.h"
#include "seqlist.h"
//队列是一种特殊的线性表
//创建一个队列 相当于创建一个顺序存储的线性表
SeqQueue* SeqQueue_Create(int capacity)
{
return SeqList_Create(capacity);
}
//销毁队列 相当于 销毁顺序存储的线性表
void SeqQueue_Destory(SeqQueue* queue)
{
SeqList_Destory(queue);
}
//清空队列 相当于 清空顺序存储的线性表
void SeqQueue_Clear(SeqQueue* queue)
{
SeqList_Clear(queue);
}
//向队列中插入一个元素 相当于 向线性表中插入一个元素
//尾插法
int SeqQueue_Append(SeqQueue* queue, void* item)
{
return SeqList_Insert(queue, item, SeqList_Length(queue));
}
//出队列 相当于 从线性表的0号位置删除元素
void* SeqQueue_Retrieve(SeqQueue* queue)
{
return SeqList_Delete(queue, 0);
}
//获取队列头部 相当于 获取线性表的0号位置元素
void* SeqQueue_Header(SeqQueue* queue)
{
return SeqList_Get(queue, 0);
}
//获取队列的长度 相当于 获取线性表的长度
int SeqQueue_Length(SeqQueue* queue)
{
return SeqList_Length(queue);
}
//获取队列的容量 相当于 获取线性表的容量
int SeqQueue_Capacity(SeqQueue* queue)
{
return SeqList_Capacity(queue);
}
(3)具体实现
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "seqqueue.h"
void maindm008()
{
int ret = 0;
int a[10];
//创建队列
SeqQueue* queue = NULL;
queue = SeqQueue_Create(10);
if (queue == NULL)
{
ret = -1;
printf("func SeqQueue_Create() err:%d\n", ret);
return ;
}
//插入元素
for (int i = 0; i < 5; i++)
{
a[i] = i + 1;
SeqQueue_Append(queue, &a[i]);
}
//打印队列的属性
printf("The Queue's Header:%d\n", *((int*)SeqQueue_Header(queue)));//队头元素
printf("The Queue's Length:%d\n", SeqQueue_Length(queue));//队列的长度
printf("The Queue's Capacity:%d\n", SeqQueue_Capacity(queue));//队列的容量
//删除元素
while (SeqQueue_Length(queue) > 0)
{
int tmp = *((int*)SeqQueue_Retrieve(queue));
printf("tmp:%d ", tmp);
}
printf("\n");
//销毁队列
SeqQueue_Destory(queue);
system("pause");
return;
}