第17课——队列的定义与实现
队列的定义
队列是一种特殊的线性表
队列仅在线性表的两端进行操作
队头(front):取出数据元素的一端
队尾(rear):插入数据元素的一端
队列不允许在中间部位进行操作!
队列的性质
队列的一些常用操作
创建队列
销毁队列
清空队列
进队列
出队列
获取队头元素
获取队列的长度
队列的顺序存储实现
代码实现
复用前面的顺序表实现顺序队列
#include "SeqList.h" #include "SeqQueue.h" SeqQueue* SeqQueue_Create(int capacity) // O(1) { return SeqList_Create(capacity); } void SeqQueue_Destroy(SeqQueue* queue) // O(1) { SeqList_Destroy(queue); } void SeqQueue_Clear(SeqQueue* queue) // O(1) { SeqList_Clear(queue); } int SeqQueue_Append(SeqQueue* queue, void* item) // O(1) { return SeqList_Insert(queue, item, SeqList_Length(queue)); } void* SeqQueue_Retrieve(SeqQueue* queue) // O(n) { return SeqList_Delete(queue, 0); } void* SeqQueue_Header(SeqQueue* queue) // O(1) { return SeqList_Get(queue, 0); } int SeqQueue_Length(SeqQueue* queue) // O(1) { return SeqList_Length(queue); } int SeqQueue_Capacity(SeqQueue* queue) // O(1) { return SeqList_Capacity(queue); }
main.c
#include <stdio.h> #include <stdlib.h> #include "SeqQueue.h" int main(int argc, char *argv[]) { SeqQueue* queue = SeqQueue_Create(20); int a[10] = {0}; int i = 0; for(i=0; i<10; i++) { a[i] = i + 1; SeqQueue_Append(queue, a + i); //从队尾插入元素 } printf("Header: %d\n", *(int*)SeqQueue_Header(queue)); printf("Length: %d\n", SeqQueue_Length(queue)); printf("Capacity: %d\n", SeqQueue_Capacity(queue)); while( SeqQueue_Length(queue) > 0 ) { printf("Retrieve: %d\n", *(int*)SeqQueue_Retrieve(queue)); //删除并打印 } SeqQueue_Destroy(queue); return 0; }
运行结果
队列的链式存储实现
代码实现
复用前面的线性表的链式存储代码
#include <malloc.h> #include <stdio.h> #include "LinkList.h" #include "LinkQueue.h" typedef struct _tag_LinkQueueNode { LinkListNode header; void* item; } TLinkQueueNode; LinkQueue* LinkQueue_Create() // O(1) { return LinkList_Create(); } void LinkQueue_Destroy(LinkQueue* queue) // O(n) { LinkQueue_Clear(queue); LinkList_Destroy(queue); } void LinkQueue_Clear(LinkQueue* queue) // O(n) { while( LinkQueue_Length(queue) > 0 ) { LinkQueue_Retrieve(queue); } } int LinkQueue_Append(LinkQueue* queue, void* item) // O(n) { TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode)); int ret = (item != NULL) && (node != NULL); if( ret ) { node->item = item; ret = LinkList_Insert(queue, (LinkListNode*)node, LinkList_Length(queue)); } if( !ret ) { free(node); } return ret; } void* LinkQueue_Retrieve(LinkQueue* queue) // O(1) { TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Delete(queue, 0); void* ret = NULL; if( node != NULL ) { ret = node->item; free(node); } return ret; } void* LinkQueue_Header(LinkQueue* queue) // O(1) { TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue, 0); void* ret = NULL; if( node != NULL ) { ret = node->item; } return ret; } int LinkQueue_Length(LinkQueue* queue) // O(1) { return LinkList_Length(queue); }
main.c
#include <stdio.h> #include <stdlib.h> #include "LinkQueue.h" int main(int argc, char *argv[]) { LinkQueue* queue = LinkQueue_Create(); int a[10] = {0}; int i = 0; for(i=0; i<10; i++) { a[i] = i + 1; LinkQueue_Append(queue, a + i); } printf("Header: %d\n", *(int*)LinkQueue_Header(queue)); printf("Length: %d\n", LinkQueue_Length(queue)); while( LinkQueue_Length(queue) > 0 ) { printf("Retrieve: %d\n", *(int*)LinkQueue_Retrieve(queue)); } LinkQueue_Destroy(queue); return 0; }
运行结果
总结
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并,获取更多隐藏干货,QQ交流群:859800032 微信公众号:Crystal软件学堂
作者:Liu_Jing bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |