Мы уже познакомились с двумя типами очередей и они оказались достаточно простыми. Однако существует еще одна очередь - очередь с приоритетом.
Дело в том, что часто необходимо создать очередь, где (извините за тавтологию) очередность выхода зависит от приоритетов элементов. В качестве приоритета может выступать какое-либо число, временная константа и т. п. В момент извлечения элемента будет выбран тот элемент, который обладает большим приоритетом.
Существует несколько видов приоритетных очередей:
#include <iostream>
#include <string.h>
#include <time.h>
using namespace std;
class QueuePriority
{
// Очередь
int * Wait;
// Приоритет
int * Pri;
// Максимальный размер очереди
int MaxQueueLength;
// Текущий размер очереди
int QueueLength;
public:
// Конструктор
QueuePriority(int m);
//Деструктор
~QueuePriority();
// Добавление элемента
void Add(int c,int p);
// Извлечение элемента
int Extract();
// Очистка очереди
void Clear();
// Проверка существования элементов в очереди
bool IsEmpty();
// Проверка на переполнение очереди
bool IsFull();
// Количество элементов в очереди
int GetCount();
//демонстрация очереди
void Show();
};
void QueuePriority::Show(){
cout<<"\n-------------------------------------\n";
//демонстрация очереди
for(int i=0;i<QueueLength;i++){
cout<<Wait[i]<<" - "<<Pri[i]<<"\n\n";
}
cout<<"\n-------------------------------------\n";
}
QueuePriority::~QueuePriority()
{
//удаление очереди
delete[]Wait;
delete[]Pri;
}
QueuePriority::QueuePriority(int m)
{
//получаем размер
MaxQueueLength=m;
//создаем очередь
Wait=new int[MaxQueueLength];
Pri=new int[MaxQueueLength];
// Изначально очередь пуста
QueueLength = 0;
}
void QueuePriority::Clear()
{
// Эффективная "очистка" очереди
QueueLength = 0;
}
bool QueuePriority::IsEmpty()
{
// Пуст?
return QueueLength == 0;
}
bool QueuePriority::IsFull()
{
// Полон?
return QueueLength == MaxQueueLength;
}
int QueuePriority::GetCount()
{
// Количество присутствующих в стеке элементов
return QueueLength;
}
void QueuePriority::Add(int c,int p)
{
// Если в очереди есть свободное место, то увеличиваем количество
// значений и вставляем новый элемент
if(!IsFull()){
Wait[QueueLength] = c;
Pri[QueueLength] = p;
QueueLength++;
}
}
int QueuePriority::Extract()
{
// Если в очереди есть элементы, то возвращаем тот,
// у которого наивысший приоритет и сдвигаем очередь
if(!IsEmpty()){
//пусть приоритетный элемент - нулевой
int max_pri=Pri[0];
//а приоритетный индекс = 0
int pos_max_pri=0;
//ищем приоритет
for(int i=1;i<QueueLength;i++)
//если встречен более приоритетный элемент
if(max_pri<Pri[i]){
max_pri=Pri[i];
pos_max_pri=i;
}
//вытаскиваем приоритетный элемент
int temp1=Wait[pos_max_pri];
int temp2=Pri[pos_max_pri];
//сдвинуть все элементы
for(int i=pos_max_pri;i<QueueLength-1;i++){
Wait[i]=Wait[i+1];
Pri[i]=Pri[i+1];
}
//уменьшаем количество
QueueLength--;
// возврат извлеченного элемента
return temp1;
}
else return -1;
}
void main()
{
srand(time(0));
//создание очереди
QueuePriority QUP(25);
//заполнение части элементов
for(int i=0;i<5;i++){
// значения от 0 до 99 (включительно)
// и приоритет от 0 до 11 (включительно)
QUP.Add(rand()%100,rand()%12);
}
//показ очереди
QUP.Show();
//извлечение элемента
QUP.Extract();
//показ очереди
QUP.Show();
}