数据结构 队列_队列的实现与分析

结构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)。

 

posted @ 2017-11-22 08:36  DreamGo  阅读(1005)  评论(0编辑  收藏  举报