Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.18 KB | None | 0 0
  1. #define MYQUEUE1_EQE 0x0000 // возврат в случае пустоты очереди
  2.  
  3. struct Queue // Блок управления очередью
  4. {
  5. int Head; // голова очереди
  6. int Tail; // хвост очереди
  7. int Size; // размер очереди (макс. колич.+1)
  8. void** Data; // хранилище данных очереди
  9. Queue(int size) // физический размер очереди
  10. {
  11. Head = Tail = 0;
  12. Data = new void*[Size = size + 1];
  13. }
  14. bool isFull() const; // очередь заполненa ?
  15. bool isEmpty()const; // очередь пустa ?
  16. };
  17.  
  18. Queue createQueue(int n); // n – макс. количество
  19. Queue createQueue(const Queue& pq); // создать очередь по образцу
  20. bool enQueue(Queue& q, void* x); // добавить x
  21. void* delQueue(Queue& q); // удалить элемент
  22. void* peekQueue(const Queue& q); // получить первый элемент
  23. int clearQueue(Queue& q); // очистить очередь
  24. void releaseQueue(Queue& q); // освободить ресурсы
  25. void* findMaxQueue(Queue &q);
  26.  
  27. #include "pch.h"
  28. #include "Queqe.h"
  29. #include <iostream>
  30.  
  31. Queue createQueue(int n) // Выделить ресурс для очереди
  32. {
  33. return *(new Queue(n));
  34. };
  35. Queue createQueue(const Queue &pq) // Создать очередь
  36. {
  37. Queue *rc = new Queue(pq.Size - 1);
  38. rc->Head = pq.Head;
  39. rc->Tail = pq.Tail;
  40. for (int i = 0; i < pq.Size; i++)
  41. rc->Data[i] = pq.Data[i];
  42. return *rc;
  43. }
  44. bool Queue::isFull() const // Очередь заполненa?
  45. {
  46. return (Head % Size == (Tail + 1) % Size);
  47. }
  48. bool Queue::isEmpty()const // Очередь пустa?
  49. {
  50. return (Head % Size == Tail % Size);
  51. }
  52. bool enQueue(Queue &q, void* x) // Добавить элемент x
  53. {
  54. bool rc = true;
  55. if (rc = !q.isFull())
  56. {
  57. q.Data[q.Tail] = x;
  58. q.Tail = (q.Tail + 1) % q.Size;
  59. }
  60. else
  61. rc = false;
  62. return rc;
  63. };
  64.  
  65. void* delQueue(Queue &q) // Удалить элемент
  66. {
  67. void* rc = (void*)MYQUEUE1_EQE;
  68. if (!q.isEmpty())
  69. {
  70. rc = q.Data[q.Head];
  71. q.Head = (q.Head + 1) % q.Size;
  72. }
  73. else
  74. rc = NULL;
  75. return rc;
  76. }
  77.  
  78. void* peekQueue(const Queue &q) // Получить первый элемент очереди
  79. {
  80. void* rc = (void*)MYQUEUE1_EQE;
  81. if (!q.isEmpty())
  82. rc = q.Data[q.Head];
  83. else
  84. rc = NULL;
  85. return rc;
  86. }
  87.  
  88. int clearQueue(Queue &q) // Очистить очередь
  89. {
  90. int rc = (q.Tail - q.Head) >= 0 ? q.Tail - q.Head : (q.Size - q.Head + q.Tail + 1);
  91. q.Tail = q.Head = 0;
  92. return rc; // колич. элементов до очистки
  93. }
  94. void releaseQueue(Queue &q) // Освободить ресурсы очереди
  95. {
  96. delete[] q.Data;
  97. q.Size = 1;
  98. q.Head = q.Tail = 0;
  99. }
  100.  
  101. void* findMaxQueue(Queue &q) {
  102. void* max =q.Data[1];
  103. return max;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement