什么是队列?
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,
而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。
进行插入操作的端称为队尾,进行删除操作的端称为队头。
将双端链表封装成队列
只需要定义一个栈的结构体,结构体里面只需要包含一个指向栈的指针就好了。队列的
其他操作只需要调用队列的部分操作就行了。
所以必须包含两个文件
dlist.h
dlist.c
队列的声明
源代码请看queue.h1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef _QUEUE_H_
#define _QUEUE_H_
#include"dlist.h"
typedef struct Queue{
Dlist *dlist; //用双端链表模仿队列
}Queue;
//队列操作接口
Queue *init_queue(void) ; //初始化队列
void destroy_queue(Queue **queue) ; //队列的销毁
Boolean is_queue_empty(Queue *queue) ; //判空
Boolean in(Queue *queue, void *value) ; //入队
Boolean out(Queue *queue) ; //出队
Boolean get_queue_front(Queue *queue, void **value); //得到队首元素
int get_queue_count(Queue *queue) ; //得到队列元素个数
#endif
队列的各个函数的实现
源代码请看queue.c1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71//队列操作接口
#include "queue.h"
#include "tools.h"
#include <strings.h>
Queue *init_queue(void) //初始化队列
{
Queue *queue = (Queue *)Malloc(sizeof(Queue));
queue->dlist = (Dlist *)malloc(sizeof(Dlist));
if(queue->dlist == NULL){
free(queue);
fprintf(stderr, "the memory is full!\n");
exit(1);
}
bzero(queue->dlist, sizeof(Dlist));
return queue;
}
void destroy_queue(Queue **queue) //队列的销毁
{
if(queue == NULL || *queue == NULL){
return ;
}
//先释放双端链表,再队列控制信息
destroy_dlist(&((*queue)->dlist));
free(*queue);
*queue = NULL;
}
Boolean is_queue_empty(Queue *queue) //判空
{
return get_count(queue->dlist) == ZERO;
}
Boolean in(Queue *queue, void *value) //入队
{
if(queue == NULL || value == NULL){
return FALSE;
}
push_back(queue->dlist, value);
return TRUE;
}
Boolean out(Queue *queue) //出队
{
if(queue == NULL || is_empty(queue)){
return FALSE;
}
return pop_front(queue->dlist);
}
Boolean get_queue_front(Queue *queue, void **value) //得到队首元素
{
if(queue == NULL || is_empty(queue)){
return FALSE;
}
if(value != NULL){
return get_front(queue->dlist, value);
}
return FALSE;
}
int get_queue_count(Queue *queue) //得到队列元素个数
{
if(queue == NULL){
return -1;
}
return get_dlist_count(queue->dlist);
}