数据结构之队列

像栈一样,队列也是表。使用队列时插入在一端进行而删除则在另一端进行。

队列基本模型

队列的数组实现

如同栈一样,对于队列而言任何表的实现都是合法的。
对于每一个队列数据结构,我们保留一个数组Queue[]以及位置Front和Rear,它们代表队列两端。还要记录实际存在队列中元素的个数Size。

这种实现存在一个潜在问题,经过10入列后,队列就满了,但其中元素并没有10个。简单的解决办法就是只要Front和Rear到达数组尾端,它就又绕回到开头,这叫循环数组的实现。

实现

1.#include <stdio.h>
2.#include <stdlib.h>
3.struct QueueRecord;
4.typedef struct QueueRecord *Queue;
5.
6.
7.struct QueueRecord
8.{
9. int Capacity;
10. int Front;
11. int Reaz;
12. int Size;
13. int *Array;
14.};
15.
16.//构造空队列
17.void MakeEmpty(Queue Q)
18.{
19. Q->Size = 0;
20. Q->Front = 1;
21. Q->Reaz=0;
22.}
23.
24.//创建队列
25.void CreateQueue(Queue Q, int MaxQueueSize)
26.{
27. if (Q == NULL)
28. {
29. printf("Error");
30. }
31. else
32. {
33. Q->Array = malloc(sizeof(int)*MaxQueueSize);
34. Q->Capacity = MaxQueueSize - 1;
35. MakeEmpty(Q);
36. }
37.}
38.
39.static int Succ(int Value, Queue Q)
40.{
41. if (++Value == Q->Capacity)
42. Value = 0;
43. return Value;
44.}
45.
46.
47.//入列
48.void Enqueue(int X, Queue Q)
49.{
50. if (Q == NULL)
51. {
52. printf("Error");
53. }
54. else
55. {
56. Q->Size++;
57. Q->Reaz = Succ(Q->Reaz, Q);
58. Q->Array[Q->Reaz] = X;
59. }
60.}
61.//出列
62.void Dequeue(Queue Q)
63.{
64. if (Q == NULL)
65. {
66. printf("Erro");
67. }
68. else
69. {
70. Q->Size--;
71. printf("%d",Q->Array[Q->Front]);
72. Q->Front = Succ(Q->Front, Q);
73. }
74.}
75.
76.void main()
77.{
78. Queue S;
79. S = malloc(sizeof(Queue));
80. CreateQueue(S,10);
81. Enqueue(5, S);
82. Dequeue(S);
83.}

 

 

posted on 2017-10-20 09:40  Mr.Tan&  阅读(261)  评论(0编辑  收藏  举报

导航