Lila25mila
15 марта 2019 г. 14:22

Очередь

Очередь - это полезная структура данных в программировании. Представьте очередь билетов за пределами кинозала, где первый человек, входящий в очередь, является первым человеком, который получает билет.


Очередь следует правилу «первым пришел - первым обслужен» (First In First Out - FIFO) - элемент, который идет первым, - это элемент, который выходит первым.

Рассмотрим рисунок. Поскольку 1 помещена в очередь до 2, она так же уйдет первой из очереди. Это следует правилу FIFO.

С точки зрения программирования, помещение элемента в очередь (empty queue - пустая очередь) называется "enqueue" (постановка в очередь), а удаление элемента из очереди - "dequeue" (снятие очереди).

Мы можем реализовать очередь на любом языке программирования, таком как C, C ++, Java, Python или C #, почти с одинаковой спецификацией.

Технические характеристики очереди

Очередь - это объект или, более конкретно, абстрактная структура данных (ADT), которая позволяет выполнять следующие операции:

  • Enqueue: добавить элемент в конец очереди;
  • Dequeue: удалить элемент из начала очереди;
  • IsEmpty: проверить, пуста ли очередь;
  • IsFull: проверьте, заполнена ли очередь;
  • Peek: получить значение начала очереди, не удаляя его.
Как работает очередь

Операции с очередями работают следующим образом:

  1. Два указателя, называемые FRONT и REAR, используются для отслеживания первого и последнего элементов в очереди.
  2. При инициализации очереди мы устанавливаем значение FRONT и REAR равным -1.
  3. При добавлении элемента мы увеличиваем значение индекса REAR и помещаем новый элемент в положение, на которое указывает REAR.
  4. При удалении элемента из очереди мы возвращаем значение, на которое указывает FRONT, и увеличиваем индекс FRONT.
  5. Перед постановкой в очередь мы проверяем, заполнена ли очередь.
  6. Перед снятием очереди мы проверяем, пуста ли очередь.
  7. При инициализации первого элемента мы устанавливаем значение FRONT в 0.
  8. При удалении последнего элемента мы сбрасываем значения FRONT и REAR в -1.

Реализация очереди на языке программирования

Наиболее распространенная реализация очереди использует массивы, но также очередь может быть реализована с использованием списков.

Реализация с использованием C-программирования
  1. #include<stdio.h>
  2. #define SIZE 5
  3.  
  4. void enQueue(int);
  5. void deQueue();
  6. void display();
  7.  
  8. int items[SIZE], front = -1, rear = -1;
  9.  
  10. int main()
  11. {
  12. //deQueue невозможно в пустой очереди
  13. deQueue();
  14.  
  15. //enQueue 5 elements
  16. enQueue(1);
  17. enQueue(2);
  18. enQueue(3);
  19. enQueue(4);
  20. enQueue(5);
  21.  
  22. //6-й элемент не может быть добавлен в очередь, потому что очередь заполнена
  23. enQueue(6);
  24.  
  25. display();
  26.  
  27. //deQueue удаляет элемент, введенный первым, т.е. 1
  28. deQueue();
  29.  
  30. //Теперь у нас всего 4 элемента
  31. display();
  32.  
  33. return 0;
  34.  
  35. }
  36.  
  37. void enQueue(int value){
  38. if(rear == SIZE-1)
  39. printf("\nQueue is Full!!");
  40. else {
  41. if(front == -1)
  42. front = 0;
  43. rear++;
  44. items[rear] = value;
  45. printf("\nInserted -> %d", value);
  46. }
  47. }
  48.  
  49. void deQueue(){
  50. if(front == -1)
  51. printf("\nQueue is Empty!!");
  52. else{
  53. printf("\nDeleted : %d", items[front]);
  54. front++;
  55. if(front > rear)
  56. front = rear = -1;
  57. }
  58. }
  59.  
  60. void display(){
  61. if(rear == -1)
  62. printf("\nQueue is Empty!!!");
  63. else{
  64. int i;
  65. printf("\nQueue elements are:\n");
  66. for(i=front; i<=rear; i++)
  67. printf("%d\t",items[i]);
  68. }
  69. }

Когда вы запускаете эту программу, вы получаете следующее:

  1. Queue is Empty!!
  2. Inserted -> 1
  3. Inserted -> 2
  4. Inserted -> 3
  5. Inserted -> 4
  6. Inserted -> 5
  7. Queue is Full!!
  8. Queue elements are:
  9. 1 2 3 4 5
  10. Deleted : 1
  11. Queue elements are:
  12. 2 3 4 5
Реализация с использованием программирования на C ++
  1. #include <iostream>
  2. #define SIZE 5
  3.  
  4. using namespace std;
  5.  
  6. class Queue {
  7. private:
  8. int items[SIZE], front, rear;
  9.  
  10. public:
  11. Queue(){
  12. front = -1;
  13. rear = -1;
  14. }
  15.  
  16. bool isFull(){
  17. if(front == 0 && rear == SIZE - 1){
  18. return true;
  19. }
  20. return false;
  21. }
  22.  
  23. bool isEmpty(){
  24. if(front == -1) return true;
  25. else return false;
  26. }
  27.  
  28. void enQueue(int element){
  29. if(isFull()){
  30. cout << "Queue is full";
  31. } else {
  32. if(front == -1) front = 0;
  33. rear++;
  34. items[rear] = element;
  35. cout << endl << "Inserted " << element << endl;
  36. }
  37. }
  38.  
  39. int deQueue(){
  40. int element;
  41. if(isEmpty()){
  42. cout << "Queue is empty" << endl;
  43. return(-1);
  44. } else {
  45. element = items[front];
  46. if(front >= rear){
  47. front = -1;
  48. rear = -1;
  49. } /* В Q есть только один элемент, поэтому мы удаляем очередь после удаления. */
  50. else {
  51. front++;
  52. }
  53. cout << endl << "Deleted -> " << element << endl;
  54. return(element);
  55. }
  56. }
  57.  
  58. void display()
  59. {
  60. /* Функция для отображения элементов очереди */
  61. int i;
  62. if(isEmpty()) {
  63. cout << endl << "Empty Queue" << endl;
  64. }
  65. else
  66. {
  67. cout << endl << "Front -> " << front;
  68. cout << endl << "Items -> ";
  69. for(i=front; i<=rear; i++)
  70. cout << items[i] << ""\t";
  71. cout << endl << "Rear -> " << rear << endl;
  72. }
  73. }
  74.  
  75. };
  76.  
  77.  
  78. int main()
  79. {
  80. Queue q;
  81.  
  82. //deQueue невозможно в пустой очереди
  83. q.deQueue();
  84.  
  85. //enQueue 5 элементов
  86. q.enQueue(1);
  87. q.enQueue(2);
  88. q.enQueue(3);
  89. q.enQueue(4);
  90. q.enQueue(5);
  91.  
  92. //6-й элемент не может быть добавлен в очередь, потому что очередь заполнена
  93. q.enQueue(6);
  94.  
  95. q.display();
  96.  
  97. //deQueue удаляет элемент, введенный первым, т.е. 1
  98. q.deQueue();
  99.  
  100. //Теперь у нас всего 4 элемента
  101. q.display();
  102.  
  103. return 0;
  104. }

После запуска мы получим:

  1. Queue is empty
  2.  
  3. Inserted 1
  4.  
  5. Inserted 2
  6.  
  7. Inserted 3
  8.  
  9. Inserted 4
  10.  
  11. Inserted 5
  12. Queue is full
  13. Front -> 0
  14. Items -> 1 2 3 4 5
  15. Rear -> 4
  16.  
  17. Deleted -> 1
  18.  
  19. Front -> 1
  20. Items -> 2 3 4 5
  21. Rear -> 4
Ограничение этой реализации

Как вы можете видеть на изображении ниже, через некоторое время после добавления в очередь и удаления из очереди, размер очереди был уменьшен.

Индексы 0 и 1 могут использоваться только после сброса очереди, когда все элементы удалены.

Изменяя код для очереди, мы можем использовать пространство путем реализации модифицированной очереди, называемой циклической очередью.

По статье задано0вопрос(ов)

2

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
  • Последние комментарии
  • Evgenii Legotckoi
    16 апреля 2025 г. 17:08
    Благодарю за отзыв. И вам желаю всяческих успехов!
  • IscanderChe
    12 апреля 2025 г. 17:12
    Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
  • AK
    1 апреля 2025 г. 11:41
    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
  • Evgenii Legotckoi
    9 марта 2025 г. 21:02
    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
  • VP
    9 марта 2025 г. 16:14
    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…