Очередь - это полезная структура данных в программировании. Представьте очередь билетов за пределами кинозала, где первый человек, входящий в очередь, является первым человеком, который получает билет.
Очередь следует правилу «первым пришел - первым обслужен» (First In First Out - FIFO) - элемент, который идет первым, - это элемент, который выходит первым.
Рассмотрим рисунок. Поскольку 1 помещена в очередь до 2, она так же уйдет первой из очереди. Это следует правилу FIFO.
С точки зрения программирования, помещение элемента в очередь (empty queue - пустая очередь) называется "enqueue" (постановка в очередь), а удаление элемента из очереди - "dequeue" (снятие очереди).
Мы можем реализовать очередь на любом языке программирования, таком как C, C ++, Java, Python или C #, почти с одинаковой спецификацией.
Технические характеристики очереди
Очередь - это объект или, более конкретно, абстрактная структура данных (ADT), которая позволяет выполнять следующие операции:
- Enqueue: добавить элемент в конец очереди;
- Dequeue: удалить элемент из начала очереди;
- IsEmpty: проверить, пуста ли очередь;
- IsFull: проверьте, заполнена ли очередь;
- Peek: получить значение начала очереди, не удаляя его.
Как работает очередь
Операции с очередями работают следующим образом:
- Два указателя, называемые FRONT и REAR, используются для отслеживания первого и последнего элементов в очереди.
- При инициализации очереди мы устанавливаем значение FRONT и REAR равным -1.
- При добавлении элемента мы увеличиваем значение индекса REAR и помещаем новый элемент в положение, на которое указывает REAR.
- При удалении элемента из очереди мы возвращаем значение, на которое указывает FRONT, и увеличиваем индекс FRONT.
- Перед постановкой в очередь мы проверяем, заполнена ли очередь.
- Перед снятием очереди мы проверяем, пуста ли очередь.
- При инициализации первого элемента мы устанавливаем значение FRONT в 0.
- При удалении последнего элемента мы сбрасываем значения FRONT и REAR в -1.
Реализация очереди на языке программирования
Наиболее распространенная реализация очереди использует массивы, но также очередь может быть реализована с использованием списков.
Реализация с использованием C-программирования
- #include<stdio.h>
- #define SIZE 5
- void enQueue(int);
- void deQueue();
- void display();
- int items[SIZE], front = -1, rear = -1;
- int main()
- {
- //deQueue невозможно в пустой очереди
- deQueue();
- //enQueue 5 elements
- enQueue(1);
- enQueue(2);
- enQueue(3);
- enQueue(4);
- enQueue(5);
- //6-й элемент не может быть добавлен в очередь, потому что очередь заполнена
- enQueue(6);
- display();
- //deQueue удаляет элемент, введенный первым, т.е. 1
- deQueue();
- //Теперь у нас всего 4 элемента
- display();
- return 0;
- }
- void enQueue(int value){
- if(rear == SIZE-1)
- printf("\nQueue is Full!!");
- else {
- if(front == -1)
- front = 0;
- rear++;
- items[rear] = value;
- printf("\nInserted -> %d", value);
- }
- }
- void deQueue(){
- if(front == -1)
- printf("\nQueue is Empty!!");
- else{
- printf("\nDeleted : %d", items[front]);
- front++;
- if(front > rear)
- front = rear = -1;
- }
- }
- void display(){
- if(rear == -1)
- printf("\nQueue is Empty!!!");
- else{
- int i;
- printf("\nQueue elements are:\n");
- for(i=front; i<=rear; i++)
- printf("%d\t",items[i]);
- }
- }
Когда вы запускаете эту программу, вы получаете следующее:
- Queue is Empty!!
- Inserted -> 1
- Inserted -> 2
- Inserted -> 3
- Inserted -> 4
- Inserted -> 5
- Queue is Full!!
- Queue elements are:
- 1 2 3 4 5
- Deleted : 1
- Queue elements are:
- 2 3 4 5
Реализация с использованием программирования на C ++
- #include <iostream>
- #define SIZE 5
- using namespace std;
- class Queue {
- private:
- int items[SIZE], front, rear;
- public:
- Queue(){
- front = -1;
- rear = -1;
- }
- bool isFull(){
- if(front == 0 && rear == SIZE - 1){
- return true;
- }
- return false;
- }
- bool isEmpty(){
- if(front == -1) return true;
- else return false;
- }
- void enQueue(int element){
- if(isFull()){
- cout << "Queue is full";
- } else {
- if(front == -1) front = 0;
- rear++;
- items[rear] = element;
- cout << endl << "Inserted " << element << endl;
- }
- }
- int deQueue(){
- int element;
- if(isEmpty()){
- cout << "Queue is empty" << endl;
- return(-1);
- } else {
- element = items[front];
- if(front >= rear){
- front = -1;
- rear = -1;
- } /* В Q есть только один элемент, поэтому мы удаляем очередь после удаления. */
- else {
- front++;
- }
- cout << endl << "Deleted -> " << element << endl;
- return(element);
- }
- }
- void display()
- {
- /* Функция для отображения элементов очереди */
- int i;
- if(isEmpty()) {
- cout << endl << "Empty Queue" << endl;
- }
- else
- {
- cout << endl << "Front -> " << front;
- cout << endl << "Items -> ";
- for(i=front; i<=rear; i++)
- cout << items[i] << ""\t";
- cout << endl << "Rear -> " << rear << endl;
- }
- }
- };
- int main()
- {
- Queue q;
- //deQueue невозможно в пустой очереди
- q.deQueue();
- //enQueue 5 элементов
- q.enQueue(1);
- q.enQueue(2);
- q.enQueue(3);
- q.enQueue(4);
- q.enQueue(5);
- //6-й элемент не может быть добавлен в очередь, потому что очередь заполнена
- q.enQueue(6);
- q.display();
- //deQueue удаляет элемент, введенный первым, т.е. 1
- q.deQueue();
- //Теперь у нас всего 4 элемента
- q.display();
- return 0;
- }
После запуска мы получим:
- Queue is empty
- Inserted 1
- Inserted 2
- Inserted 3
- Inserted 4
- Inserted 5
- Queue is full
- Front -> 0
- Items -> 1 2 3 4 5
- Rear -> 4
- Deleted -> 1
- Front -> 1
- Items -> 2 3 4 5
- Rear -> 4
Ограничение этой реализации
Как вы можете видеть на изображении ниже, через некоторое время после добавления в очередь и удаления из очереди, размер очереди был уменьшен.
Индексы 0 и 1 могут использоваться только после сброса очереди, когда все элементы удалены.
Изменяя код для очереди, мы можем использовать пространство путем реализации модифицированной очереди, называемой циклической очередью.