队列和stack类似,stack是先进后出,而queue的先进先出,也是一种特殊的线性表
基本概念
概念
队列是一种特殊的线性表
队列仅在线性表的两端进行操作
队头(Front):取出数据元素的一端
队尾(Rear):插入数据元素的一端
队列不允许在中间部位进行操作
常用操作
- 销毁队列
 - 清空队列
 - 进队列
 - 出队列
 - 获取队头元素
 - 获取队列的长度
 
1  | 
  | 
队列的顺序存储设计与实现
(*.h)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
void* SeqQueue_Retrieve(SeqQueue* queue);
void* SeqQueue_Header(SeqQueue* queue);
int SeqQueue_Length(SeqQueue* queue);
int SeqQueue_Capacity(SeqQueue* queue);
(*.c)1
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
//创建队列,相当于创建一个线性表
SeqQueue* SeqQueue_Create(int capacity)
{
	return SeqList_Create(capacity);
}
void SeqQueue_Destroy(SeqQueue* queue)
{
	SeqList_Destroy(queue);
}
void SeqQueue_Clear(SeqQueue* queue)
{
	SeqList_Clear(queue);
}
//向队列中添加元素,相当于向线性表中,尾部插入元素
int SeqQueue_Append(SeqQueue* queue, void* item)
{
	return SeqList_Insert(queue, item, SeqList_Length(queue));
}
//从队列中删除元素,相当于从线性表中删除第一个元素
void* SeqQueue_Retrieve(SeqQueue* queue)
{
	return SeqList_Delete(queue, 0);
}
void* SeqQueue_Header(SeqQueue* queue)
{
	return SeqList_Get(queue, 0);
}
int SeqQueue_Length(SeqQueue* queue)
{
	return SeqList_Length(queue);
}
int SeqQueue_Capacity(SeqQueue* queue)
{
	return SeqList_Capacity(queue);
}
(test)1
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
void main()
{
	int i, a[10];
	SeqQueue *queue = NULL;
	queue = SeqQueue_Create(10);
	//向队列中放元素
	for (i = 0; i < 10; i++)
	{
		a[i] = i + 1;
		SeqQueue_Append(queue, &a[i]);
	}
	printf("the header of queue: %d \n", *((int *)SeqQueue_Header(queue)));
	printf("the length of queue: %d \n", SeqQueue_Length(queue));
	printf("the capacity of queue: %d \n", SeqQueue_Capacity(queue));
	//删除队列
	while (SeqQueue_Length(queue) > 0)
	{
		printf("%d \n", *((int *)SeqQueue_Retrieve(queue)));
	}
	SeqQueue_Destroy(queue);
	system("pause");
}
队列的链式存储设计与实现
(*.h)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
typedef void LinkQueue;
LinkQueue* LinkQueue_Create();
void LinkQueue_Destroy(LinkQueue* queue);
void LinkQueue_Clear(LinkQueue* queue);
int LinkQueue_Append(LinkQueue* queue, void* item);
void* LinkQueue_Retrieve(LinkQueue* queue);
void* LinkQueue_Header(LinkQueue* queue);
int LinkQueue_Length(LinkQueue* queue);
(*.c)1
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
typedef struct _tag_LinkQueueNode
{
	LinkListNode	node;
	void			*item;
}TLinkQueueNode;
//创建一个队列,相当于创建一个线性表
LinkQueue* LinkQueue_Create() //O(1)
{
	return LinkList_Create();
}
void LinkQueue_Destroy(LinkQueue* queue) //O(1)
{
	LinkQueue_Clear(queue);
	LinkList_Destroy(queue);
}
void LinkQueue_Clear(LinkQueue* queue) //O(n)
{
	while (LinkQueue_Length(queue) > 0)
	{
		LinkQueue_Retrieve(queue);
	}
	//LinkQueue_Clear(queue);
}
//向队列中添加元素,相当于向队列的尾部插入元素
int LinkQueue_Append(LinkQueue* queue, void* item) //O(n)
{
	int					ret = 0;
	TLinkQueueNode *	node = NULL;
	//需要向linklist中添加业务节点,需要在业务节点中包含链表结点
	//需要让链表结点放在业务节点的第一个成员域。
	//把形参item,转换为 linklist识别的业务节点
	node = (TLinkQueueNode *)malloc(sizeof(TLinkQueueNode));
	if (node == NULL)
	{
		return -1;
	}
	memset(node, 0, sizeof(TLinkQueueNode));
	node->item = item;
	ret = LinkList_Insert(queue, (LinkListNode *)node, LinkList_Length(queue));
	if (ret != 0)
	{
		free(node);
		return -2;
	}
	return ret;
}
//从队列删除元素,相当于从队列的头部拿元素
void* LinkQueue_Retrieve(LinkQueue* queue) //O(1)
{
	int			ret = 0;
	void *		item = NULL;
	TLinkQueueNode *node = NULL;
	//需要向linklist中添加业务节点,需要在业务节点中包含链表结点
	node = (TLinkQueueNode *)LinkList_Delete(queue, 0);
	if (node == NULL)
	{
		return NULL;
	}
	item = node->item;
	if (node != NULL)
	{
		free(node);
		node = NULL;
	}
	return item;
}
//获取队列头元素,相当于从队列0位置拿元素
void* LinkQueue_Header(LinkQueue* queue) //O(1)
{
	int					ret = 0;
	void *				item = NULL;
	TLinkQueueNode *	node = NULL;
	node = (TLinkQueueNode *)LinkList_Get(queue, 0);
	if (node == NULL)
	{
		return NULL;
	}
	item = node->item;
	return item;
}
int LinkQueue_Length(LinkQueue* queue)
{
	return LinkList_Length(queue);
}
(test)1
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
void main(void)
{
	int i , a[10];
	LinkQueue* queue = NULL;
	queue = LinkQueue_Create();
	//向队列中添加元素
	for (i=0; i<10; i++)
	{
		a[i] = i + 1;
		LinkQueue_Append(queue, &a[i]);
	}
	//
	printf("the length of queue: %d \n", LinkQueue_Length(queue));
	printf("the header of queue: %d \n", *((int *)LinkQueue_Header(queue)));
	while (LinkQueue_Length(queue) > 0)
	{
		printf("%d \n", *((int *)LinkQueue_Retrieve(queue)));
	}
	LinkQueue_Destroy(queue);
	system("pause");
}