数据结构之队列
像栈一样,队列也是表。使用队列时插入在一端进行而删除则在另一端进行。
队列基本模型
队列的数组实现
如同栈一样,对于队列而言任何表的实现都是合法的。
对于每一个队列数据结构,我们保留一个数组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.}
如本文对您有帮助请移步右下角,推荐本文,谢谢大家的点赞,因为您的支持是我最大动力