Подобно стеку , очередь представляет собой линейную структуру, которая следует определенному порядку выполнения операций. Порядок Р IRST Н ФО IRST ут (FIFO). Хорошим примером очереди является любая очередь потребителей для ресурса, где первым обслужен потребитель, который пришел первым. Разница между стеками и очередями заключается в удалении. В стеке мы удаляем элемент, который был добавлен последним; в очереди удаляем элемент, наименее добавленный за последнее время.
Операции в очереди: В основном следующие четыре основные операции выполняются в очереди:
Постановка в очередь: добавляет элемент в очередь. Если очередь заполнена, это называется условием переполнения. Dequeue: удаляет элемент из очереди. Элементы появляются в том же порядке, в котором они помещены. Если очередь пуста, то говорят, что это условие Underflow. Front: получить передний элемент из очереди. Сзади: получить последний элемент из очереди.
Приложения очереди: Очередь используется , когда вещи не должны быть обработаны немедленно, но должны быть обработаны в F IRST I п F IRST O ут порядка , как поиск в ширину . Это свойство очереди делает его также полезным в следующих сценариях.
1) Когда ресурс распределяется между несколькими потребителями. Примеры включают планирование ЦП, планирование диска. 2) Когда данные передаются асинхронно (данные не обязательно принимаются с той же скоростью, что и отправленные) между двумя процессами. Примеры включают буферы ввода-вывода, каналы, файловый ввод-вывод и т. Д.
Смотрите это для более подробного применения очереди и стека.
Реализация массива очереди Для реализации очереди нам нужно отслеживать два индекса: передний и задний. Мы ставим в очередь предмет сзади и снимаем предмет спереди. Если мы просто увеличиваем передний и задний индексы, то могут возникнуть проблемы, передний может достигнуть конца массива. Решение этой проблемы заключается в круговом увеличении передней и задней части (подробности см. В этом разделе)
C ++
// Программа CPP для реализации массива очереди #include <bits/stdc++.h>
usingnamespacestd;
// Структура для представления очереди
classQueue
{
public:
intfront, rear, size;
unsigned capacity;
int* array;
};
// функция для создания очереди заданной емкости. // Инициализирует размер очереди как 0 Queue* createQueue(unsigned capacity) {
Queue* queue = newQueue();
queue->capacity = capacity;
queue->front = queue->size = 0;
queue->rear = capacity - 1; // Это важно, см. Очередь
// Программа драйвера для проверки вышеуказанных функций ./
intmain()
{
structQueue* queue = createQueue(1000);
enqueue(queue, 10);
enqueue(queue, 20);
enqueue(queue, 30);
enqueue(queue, 40);
printf("%d dequeued from queue\n\n", dequeue(queue));
printf("Front item is %d\n", front(queue));
printf("Rear item is %d\n", rear(queue));
return0;
}
Джава
// Java-программа для реализации массива очереди
// Класс для представления очереди
classQueue
{
intfront, rear, size;
intcapacity;
intarray[];
publicQueue(intcapacity) {
this.capacity = capacity;
front = this.size = 0;
rear = capacity - 1;
array = newint[this.capacity];
}
// очередь заполнена, когда размер становится равным
// емкость
booleanisFull(Queue queue)
{ return(queue.size == queue.capacity);
}
// очередь пуста при размере 0
booleanisEmpty(Queue queue)
{ return(queue.size == 0); }
// Метод добавления элемента в очередь.
// Он меняет тыл и размер
voidenqueue( intitem)
{
if(isFull(this))
return;
this.rear = (this.rear + 1)%this.capacity;
this.array[this.rear] = item;
this.size = this.size + 1;
System.out.println(item+ " enqueued to queue");
}
// Метод удаления элемента из очереди.
// Изменяет фронт и размер
intdequeue()
{
if(isEmpty(this))
returnInteger.MIN_VALUE;
intitem = this.array[this.front];
this.front = (this.front + 1)%this.capacity;
this.size = this.size - 1;
returnitem;
}
// Метод получения фронта очереди
intfront()
{
if(isEmpty(this))
returnInteger.MIN_VALUE;
returnthis.array[this.front];
}
// Способ получить заднюю очередь
intrear()
{
if(isEmpty(this))
returnInteger.MIN_VALUE;
returnthis.array[this.rear];
}
}
// Класс водителя
publicclassTest
{
publicstaticvoidmain(String[] args)
{
Queue queue = newQueue(1000);
queue.enqueue(10);
queue.enqueue(20);
queue.enqueue(30);
queue.enqueue(40);
System.out.println(queue.dequeue() +
" dequeued from queue\n");
System.out.println("Front item is "+
queue.front());
System.out.println("Rear item is "+
queue.rear());
}
}
// Этот код предоставлен Gaurav Miglani
python3
# Python3 программа для реализации массива очереди
# Class Queue для представления очереди
classQueue:
функция # __init__
def__init__(self, capacity):
self.front =self.size =0
self.rear =capacity -1
self.Q =[None]*capacity
self.capacity =capacity
# Очередь заполнена, когда размер становится
# равно мощности
defisFull(self):
returnself.size ==self.capacity
# Очередь пуста, когда размер равен 0
defisEmpty(self):
returnself.size ==0
# Функция для добавления элемента в очередь.
# Это меняет тыл и размер
defEnQueue(self, item):
ifself.isFull():
print("Full")
return
self.rear =(self.rear +1) %(self.capacity)
self.Q[self.rear] =item
self.size =self.size +1
print("%s enqueued to queue"%str(item))
# Функция для удаления элемента из очереди.
# Изменяет фронт и размер
defDeQueue(self):
ifself.isEmpty():
print("Empty")
return
print("%s dequeued from queue"%str(self.Q[self.front]))
self.front =(self.front +1) %(self.capacity)
self.size =self.size -1
# Функция, чтобы получить начало очереди
defque_front(self):
ifself.isEmpty():
print("Queue is empty")
print("Front item is", self.Q[self.front])
# Функция, чтобы получить заднюю часть очереди
defque_rear(self):
ifself.isEmpty():
print("Queue is empty")
print("Rear item is", self.Q[self.rear])
Код водителя
if__name__ =='__main__':
queue =Queue(30)
queue.EnQueue(10)
queue.EnQueue(20)
queue.EnQueue(30)
queue.EnQueue(40)
queue.DeQueue()
queue.que_front()
queue.que_rear()
C #
// C # программа для реализации массива очереди
usingSystem;
namespaceGeeksForGeeks
{
// Класс для представления линейной очереди
classQueue
{
privateint[]ele;
privateintfront;
privateintrear;
privateintmax;
publicQueue(intsize)
{
ele = newint[size];
front = 0 ;
rear = -1;
max = size;
}
// Функция для добавления элемента в очередь.
// Он меняет тыл и размер
publicvoidenqueue(intitem)
{
if(rear == max-1)
{
Console.WriteLine("Queue Overflow");
return;
}
else
{
ele[++rear] = item;
}
}
// Функция для удаления элемента из очереди.
// Изменяет фронт и размер
publicintdequeue()
{
if(front == rear + 1)
{
Console.WriteLine("Queue is Empty");
return-1;
}
else
{
Console.WriteLine( ele[front]+" dequeued from queue");
intp = ele[front++];
Console.WriteLine();
Console.WriteLine("Front item is {0}",ele[front]);
Console.WriteLine("Rear item is {0} ",ele[rear]);
returnp;
}
}
// Функция для печати очереди.
publicvoidprintQueue()
{
if(front == rear + 1)
{
Console.WriteLine("Queue is Empty");
return;
}
else
{
for(inti = front; i <= rear; i++)
{
Console.WriteLine(ele[i]+ " enqueued to queue");
}
}
}
}
// Код драйвера
classProgram
{
staticvoidMain()
{
Queue Q = newQueue(5);
Q.enqueue(10);
Q.enqueue(20);
Q.enqueue(30);
Q.enqueue(40);
Q.printQueue();
Q.dequeue();
}
}
}
Выход:
10 enqueued to queue
20 enqueued to queue
30 enqueued to queue
40 enqueued to queue
10 dequeued from queue
Front item is 20
Rear item is 40
Сложность времени: временная сложность всех операций, таких как enqueue (), dequeue (), isFull (), isEmpty (), front () и Rear (), равна O (1). Там нет цикла ни в одной из операций.