Алгоритмы основных операций с полустатической очередью.
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Для работы с очередью вводят два указателя: один – на начало очереди (F), второй – на ее конец (R).

 

Full (q)

if R = maxQ then full = true

           else full = false

endif

return

 

Empty (q)

if R < F then empty = true

   else empty = false

endif

return

 

Insert (q, x)

Full (q)

if full = true then ‘ переполнение ’

           stop

           return

endif

R = R + 1

q(R) = x

return

 

Remove (q)

Empty (q)

if empty = true then ‘ пусто ’

           stop

      return

endif

x = q(F)

F = F + 1

return

 

 

Пример работы с очередью с использованием стандартных процедур.

Пусть очередь реализуется с помощью массива из 5 элементов.

MaxQ = 5

R = 0, F = 1

Условие пустоты очереди R < F (0 < 1)

 

Производим вставку элементов A, B и C в очередь.

 

Insert(q, A);

Insert(q, B);

Insert(q, C);

Убираем элементы A и B из очереди.

Remove(q);

Remove(q);

 

Добавляем элементы D и E:

Insert (q, D);

Insert (q, E);

 

Убираем элементы С,D и E из очереди:

Remove (q);

Remove (q);

Remove (q).

 

К сожалению, при подобном представлении очереди возникла абсурдная ситуация, при которой очередь является пустой, однако новый элемент разместить в ней нельзя, так как R = maxQ.  

              

         

                   Рис. 2.16 `

 

Одним из решений возникшей проблемы может быть модификация операции remove таким образом, что при удалении очередного элемента вся очередь смещается к началу массива.

Переменная F больше не требуется, поскольку первый элемент массива всегда является началом очереди.

Пустая очередь представлена очередью, для которой значение R равно нулю.

       

               

                   Рис. 2.16’’

 

 

Произведем вставку элементов A, B и C в очередь:

Insert (q, A);

Insert (q, B);

Insert (q, C);

 

             

       

                           Рис. 2.16’’’

 

Убираем элемент A  из очереди:

Remove (q)

 

                      

                           Рис. 2.16’’’’

 

 

Операция remove (q) может быть в этом случае реализована следующим образом:

 

Remove (q)

x = q(1)

for i =1 to R-1

   q(i) = q(i+1)

next i

R =R-1

return

 

При такой модификации элементы очереди смещаются к началу массива, R=2.

 

                  

 

                           Рис 2.16’’’’’.                          

 

Однако этот метод весьма непроизводителен. Каждое уда­ление требует перемещения всех оставшихся в очереди элементов. Если очередь содержит 500 или 1000 элементов, то очевидно, что это весьма неэффективный способ. Кроме того, операция удаления элемента из очереди логически предполагает манипулирование только с одним элементом, т. е. с тем, который расположен в начале очереди. Реализация данной операции должна отражать именно этот факт, не производя при этом множества дополнительных действий.

Другой способ предполагает рассматривать массив, который содержит очередь в виде замкнутого кольца, а не линейной последовательности, имеющей начало и конец. Это означает, что первый элемент очереди следует сразу же за последним. Это означает, что даже в том случае, если последний элемент занят, новое значение может быть размещено сразу же за ним на месте первого элемента, если этот первый элемент пуст.

Дата: 2019-12-10, просмотров: 262.