您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习之队列

2013-01-06 16:26 218 查看
注:本文的主要目的是为了记录自己的学习过程,也方便与大家做交流。转载请注明来自:

http://blog.csdn.net/ab198604

        对于队列的实现方式与栈的实现方式类似,也是基于链表的操作,所以关于队列的具体代码实现也是在原有单向链表的基础之上进一步的封装后完成。队列的数据存储与检索与栈相反,它主张先进先出,与我们现实生活中的排队买票类似,第一个先排队的先买着票,其次才是第二个,第三个......

        一、队列的结构及接口定义

        与栈的结构类似,队列的结构与链表的结构一样,所以用typedef重命名即可,代码如下所示:

/*
* filename:queue.h
* author:zhm
* date:2013-01-05
*/

#ifndef QUEUE_H
#define QUEUE_H

#include <stdlib.h>
#include "list.h"

typedef List Queue; //重命名为队列Queue

        对链表有关的定义接口及操作可以登录这个地址查看相关内容:http://blog.csdn.net/ab198604/article/details/8253405

        对于队列的一些相关操作接口声明如下:

/*public interface */
#define queue_init list_init
#define queue_destroy list_destroy

int queue_enqueue(Queue *queue, const void *data);
int queue_dequeue(Queue *queue, void **data);

#define queue_peek(queue) ((queue)->head == NULL ? NULL : (queue)->head->data)
#define queue_size list_size

#endif
与栈的操作类似,它具有队列的初始化,队列的销毁,入列和出列操作等。对于队列的初始化、销毁等都是通地typedef语句对链表操作接口的重定义。queue_peek此宏用于获取队列头元素data域, queue_size此宏用于获取队列中的元数个数。

        二、队列的接口实现细节

        由于队列的初始化及销毁操作主要是链表初始化及销毁的重定义,所以在此不作说明,可以查看《数据结构学习之单向链表》一文。这里主要是实现队列的入列和出列操作,其实现的本质在于对链表操作的基础上重新包装,代码较简单,如下:

        /*
* filename:queue.c
* author: zhm
* date: 2013-01-05
*/

#include <stdlib.h>
#include <string.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);
}

        入列操作实际上调用的是链表的插入操作函数接口,出列操作则调用的是链表的删除操作函数接口。

        三、队列的具体应用举例

        在本例中,主要的逻辑思路为:先初始化队列,然后进行入列操作,顺序为:0->1->2->3->4,然后执行依次出列操作,出列的顺序与入列的顺序应该一致。以下是代码,不多说了,看了就知道:

/*
* filename: main.c
* author:zhm
* date: 2013-01-06
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include "list.h"
#include "queue.h"

/* destroy */
void destroy(void *data)
{
printf("in destroy\n");
free(data);
return;
}

/* main */
int main(int argc, char **argv)
{
Queue queue;

int *int_ptr = NULL;
int ret;
int i;

//init queue
queue_init(&queue, destroy);

//enqueue;
for(i = 0; i < 5; i++ )
{
int_ptr = NULL;
int_ptr = (int *)malloc(sizeof(int));
if( int_ptr == NULL )
return -1;
printf("enqueue: data = %d\n",i);
*int_ptr = i;
ret = queue_enqueue(&queue, (void *)int_ptr);
if( ret != 0 )
return -1;
}

printf("the size of the queue: %d\n", queue_size(&queue));

for(i = queue_size(&queue); i > 0 ; i-- )
{
int_ptr = NULL;
ret = queue_dequeue(&queue, (void **)&int_ptr);
if( ret != 0 )
return -1;
printf("i = %d, dequque data = %d\n",i, *int_ptr);
}

printf("after dequeue the size of the queue: %d\n",queue_size(&queue));
return 0;
}
上述代码通过编译后执行,结果如下图所示:



           通过结果可以看出,队列的出列执行顺序与入列时是一致的。完了!~~~

        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: