Предполагается подход, где массив рассматривается как циклическая структура данных, в которой за последним элементом идет первый элемент массива.
Пусть имеется некоторый массив: x[1..maxlen]
Для организации циклического просмотра элементов используется:
Function NEXT (i:integer):integer;
begin
if i=maxlen then NEXT:=1;
else i:=i+1;
end;
Реализация очереди позволяет добавлять и выбирать элементы без перемещения оставшихся. Начало и конец текущего состояния очереди будет фиксироваться с помощью first и last. Тогда, при включении очередного элемента в очередь будет изменяться индекс последнего элемента. А при выборке элемента из очереди будет изменяться индекс первого элемента. Вводится дополнительная переменная для корректной организации очереди на основе циклического массива: len – текущая длина очереди.
Описание очереди:
type
QUEUE=record
element:=array[1..maxlen]of el_type;
first, last, len: integer;
end;
1) Создать пустую очередь
Procedure MAKENULL ( var Q:QUEUE);
begin
Q.first=1;
Q.last=maxlen;
Q.len:=0;
end;
2) Выборка элемента из начала очереди.
function FRONT(var Q:QUEUE): el_type;
begin
if EMPTY(Q) then ERROR («Очередь пуста»)
else
begin
FRONT:=Q.element[Q.first];
Q.first:=NEXT[Q.first];
Q.len:=Q.len-1;
end;
end;
|