数据结构 队列_队列的实现与分析
结构Queue是队列的数据结构。同栈一样,也用typedef List Queue 来定义。
queue_init
队列通过queue_init初始化。经过初始化的队列才能进行其他操作。因为队列本身就是一个链表,并且初始化过程相同,所以将queue_init定义成list_init。
queue_init的运行时复杂度与list_init相同,都是O(1)。
queue_destroy
队列通过queue_destroy销毁。因为队列本身就是一个链表,并且销毁过程相同,所以将queue_destroy定义成list_destroy。
queue_destroy的运行时复杂度与list_destroy相同都是O(n),n代表队列包含元素的个数。
示例1:队列抽象数据类型的头文件
/*queue.h*/ #ifndef QUEUE_H #define QUEUE_H #include <stdlib.h> #include "list.h" /*将队列定义成链表*/ typedef List Queue; /*公开接口*/ #define queue_init list_init #define queue_destroy list_destroy int enqueue(Queue *queue,void *data); int dequeue(Queue *queue,void **data); #define queue_peek(queue)((queue)->head == NULL ? NULL : (queue)->head->data) #define queue_size list_size #endif
queue_enqueue
队列通过queue_enqueue向队列尾部插入元素。queue_enqueue调用list_ins_next方法来插入链表尾部指向data的元素。
queue_enqueue运行时复杂度与list_ins_next相同,都是O(1)。
queue_dequeue
队列通过queue_dequeue从队列头部删除元素。queue_dequeue调用list_rem_next方法来删除链表的头元素,并将data指向已删除元素中的数据。
queue_dequeue运行时复杂度与list_rem_next相同,都是O(1)。
示例2:队列抽象数据类型的实现
/*queue.c*/ #include <stdlib.h> #include "list.h" #include "queue.h" /*queue_enqueue 往队列尾部插入元素*/ int queue_enqueue(Queue *queue,const void *data) { return list_ins_next(queue,list_tail(queue),data); } /*queue_dequeue 从队列头部删除元素*/ int queue_dequeue(Queue *queue,void **data) { return list_rem_next(queue,NULL,data); }
queue_peek与queue_size
这是队列的两个宏定义,实现队列的两种简单操作。queue_peek用来获取队列头元素的信息,而不使头元素出队;queue_size用来获取队列的大小。这两种操作都是通过访问Queue的结构成员来实现的。
由于访问成员变量是一种简单的操作,只消耗固定的运行时间,所以这两种宏的运行时复杂度都为O(1)。