数据结构之顺序队列(优化版)
来源:互联网 发布:soliworks小金球软件 编辑:程序博客网 时间:2024/06/09 23:35
上一篇文章我说了顺序队列的不足之处是常用的Append操作时间复杂度是O(n),
所以我们下面就把它优化成O(1),闲话少说直接上代码。
第九个例子,顺序队列优化版的实现:
头文件
#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);int SeqQueue_Length(SeqQueue* queue);int SeqQueue_Capacity(SeqQueue* queue);void* SeqQueue_Retrieve(SeqQueue* queue);void* SeqQueue_Header(SeqQueue* queue);#endif
我个人有点小小的强迫症,代码尽量要求简洁,所以没有注释,有什么不明白的可以留言。
实现文件
#include <stdio.h>#include <malloc.h>#include "SeqQueue.h"typedef unsigned int TSeqQueueNode;typedef struct tag_SeqQueue{ int length; int capacity; int front; int rear; TSeqQueueNode* node; } TSeqQueue;SeqQueue* SeqQueue_Create(int capacity){ TSeqQueue* ret = NULL; if (capacity >= 0) { ret = (TSeqQueue*)malloc(sizeof(TSeqQueue) + sizeof(TSeqQueueNode) * capacity); } if (ret) { ret->capacity = capacity; ret->length = 0; ret->front = 0; ret->rear = 0; ret->node = (TSeqQueueNode*)(ret + 1); } return ret;}void SeqQueue_Destroy(SeqQueue* queue){ free(queue);}void SeqQueue_Clear(SeqQueue* queue){ TSeqQueue* sQueue = (TSeqQueue*)queue; if (sQueue != NULL) { sQueue->length = 0; sQueue->front = 0; sQueue->rear = 0; }}int SeqQueue_Append(SeqQueue* queue, void* item){ TSeqQueue* sQueue = (TSeqQueue*)queue; int ret = (sQueue != NULL) && (item != NULL); ret = ret && ((sQueue->length + 1) <= sQueue->capacity); if (ret) { sQueue->node[sQueue->rear] = (TSeqQueueNode)item; sQueue->rear = (sQueue->rear + 1) % sQueue->capacity; sQueue->length++; } return ret; }int SeqQueue_Length(SeqQueue* queue){ TSeqQueue* sQueue = (TSeqQueue*)queue; int ret = -1; if (sQueue != NULL) { ret = sQueue->length; } return ret;}int SeqQueue_Capacity(SeqQueue* queue){ TSeqQueue* sQueue = (TSeqQueue*)queue; int ret = -1; if (sQueue != NULL) { ret = sQueue->capacity; } return ret;}void* SeqQueue_Retrieve(SeqQueue* queue){ TSeqQueue* sQueue = (TSeqQueue*)queue; void* ret = SeqQueue_Header(queue); if (ret) { sQueue->front = (sQueue->front + 1) % sQueue->capacity; sQueue->length--; } return ret;}void* SeqQueue_Header(SeqQueue* queue){ TSeqQueue* sQueue = (TSeqQueue*)queue; void* ret = NULL; if ((sQueue != NULL) && (sQueue->length > 0)) { ret = (void*)sQueue->node[sQueue->front]; } return ret;}跟顺序表实现差不多吧!!!其实数据结构很多东西都是通用的。
#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("capacity:%d\n", SeqQueue_Capacity(queue)); printf("length:%d\n", SeqQueue_Length(queue)); printf("header:%d\n", *((int*)SeqQueue_Header(queue))); while (SeqQueue_Length(queue) > 0) { printf("retrieve:%d\n", *((int*)SeqQueue_Retrieve(queue))); } SeqQueue_Clear(queue); SeqQueue_Destroy(queue); system("PAUSE"); return 0;}测试文件跟上一个版本的一样,原封不动,测试的结果跟上一个版本的结果一样,
唯一的区别就是代码的效率提高了。
0 0
- 数据结构之顺序队列(优化版)
- 数据结构之顺序队列(循环队列)
- 数据结构之链式队列(优化版)
- 数据结构之顺序队列
- 数据结构之顺序队列
- 数据结构之顺序队列
- 数据结构之顺序队列
- 数据结构之顺序队列
- 数据结构之队列-顺序队列
- C数据结构-优化顺序队列
- 数据结构之队列(顺序队列和链式队列)
- 数据结构之顺序循环队列
- [C++] 数据结构之顺序队列
- 数据结构——队列之顺序队列
- 数据结构之顺序队列的操作(C语言)
- 数据结构之顺序队列的操作(C语言)
- 数据结构学习之循环队列(顺序存储)
- 【数据结构-队列】顺序队列
- RedHat 未注册的服务系统使用yum命令进行软件安装
- LeetCode Multiply Strings
- centos下php安装报错整理
- C++指针详解
- java虚拟机/python/编程语言的概念
- 数据结构之顺序队列(优化版)
- 文档管理系统的分类
- Android RadioGroup 自定义布局, 支持多行多列
- 基于Linux环境Tomcat-MySQL的服务器搭建
- 黑马程序员Java__多线程
- J2EE之字符编码输出
- 项目总结 不断更新中
- Android利用Soap读取WebService并且解析XML的DataSet数据
- 工作中遇到的技术问题 记录