当前位置:   article > 正文

设置循环队列_循环队列怎么调出来

循环队列怎么调出来

 链接:力扣

  1. //1.用数组模拟实现循环队列,用int head;和int tail记录头和尾的位置,使得头删不用挪动数组,只需要挪动int head;
  2. //2.或者用链表实现,头删也不用挪动数组
  3. typedef struct {
  4. int* a;//动态数组
  5. int k;//元素个数
  6. int head;//
  7. int tail;
  8. } MyCircularQueue;
  9. //初始化循环队列
  10. MyCircularQueue* myCircularQueueCreate(int k) {
  11. MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
  12. assert(obj);
  13. obj->a=(int *)malloc(sizeof(int)*(k+1));//1.因为tail==head只能判空,不能判满,所以要多开一个空间使tail->next=head;判满。法2.其实也可以根据tail==head和k的数值判满。这里用的是法1
  14. assert(obj->a);
  15. obj->head=obj->tail=0;
  16. obj->k=k;//数组k+1长,有k个元素
  17. return obj;
  18. }
  19. //判空
  20. bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
  21. assert(obj);
  22. return obj->head==obj->tail;
  23. }
  24. //判满
  25. bool myCircularQueueIsFull(MyCircularQueue* obj) {
  26. assert(obj);
  27. int next=obj->tail +1;
  28. //!!!注意next==k+1时候也要使其变为0;
  29. //1. next%=(k+1);
  30. //2.
  31. if(next==obj->k +1)
  32. {
  33. next=0;
  34. }
  35. return next==obj->head;
  36. }
  37. //从队尾入队
  38. bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) //入队
  39. {
  40. assert(obj);
  41. //判满--满了则返回false
  42. if( myCircularQueueIsFull(obj))
  43. return false;
  44. //一开始有元素和无元素是一样的,head指向首元素,tail指向尾元素的下一个
  45. obj->a[obj->tail]=value;
  46. obj->tail++;
  47. //1. obj->tail%=(k+1);--因为数组k+1长,放k个元素
  48. //2.
  49. if(obj->tail==obj->k+1)
  50. {
  51. obj->tail=0;
  52. }
  53. return true;
  54. }
  55. //从队头出队列
  56. bool myCircularQueueDeQueue(MyCircularQueue* obj) {
  57. assert(obj);
  58. if(myCircularQueueIsEmpty(obj))
  59. return false;
  60. obj->head++;
  61. //1. head%=(k+1);
  62. //2.
  63. if(obj->head==obj->k+1)
  64. {
  65. obj->head=0;
  66. }
  67. return true;
  68. }
  69. //取队头元素
  70. int myCircularQueueFront(MyCircularQueue* obj) {
  71. assert(obj);
  72. if(myCircularQueueIsEmpty(obj))
  73. return -1;
  74. return obj->a[obj->head];
  75. }
  76. //取队尾元素
  77. int myCircularQueueRear(MyCircularQueue* obj) {
  78. assert(obj);
  79. if(myCircularQueueIsEmpty(obj))
  80. return -1;
  81. //这里不能用取模手段了,因为tail-1==-1;
  82. //把tail-1再怎么模,-1%(k+1)得(-1);
  83. int prev=obj->tail-1;
  84. if(prev==-1)
  85. {
  86. prev=obj->k;
  87. //或,prev+=obj->k +1
  88. }
  89. return obj->a[prev];
  90. }
  91. //释放
  92. void myCircularQueueFree(MyCircularQueue* obj) {
  93. free(obj->a);
  94. free(obj);
  95. }
  96. /**
  97. * Your MyCircularQueue struct will be instantiated and called as such:
  98. * MyCircularQueue* obj = myCircularQueueCreate(k);
  99. * bool param_1 = myCircularQueueEnQueue(obj, value);
  100. * bool param_2 = myCircularQueueDeQueue(obj);
  101. * int param_3 = myCircularQueueFront(obj);
  102. * int param_4 = myCircularQueueRear(obj);
  103. * bool param_5 = myCircularQueueIsEmpty(obj);
  104. * bool param_6 = myCircularQueueIsFull(obj);
  105. * myCircularQueueFree(obj);
  106. */

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/590131
推荐阅读
相关标签
  

闽ICP备14008679号