队列的顺序存储设计与实现
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; }