Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГЭ_У_Студентам / ГЭ-У2_Распечатки.doc
Скачиваний:
36
Добавлен:
05.06.2015
Размер:
2.59 Mб
Скачать

Представление очереди в непрерывной памяти (в виде массива)

[Д. Прайс, стр. 181-183]

рис.5. Очередь в непрерывной памяти

  • БАЗОВЫЕ ОПЕРАЦИИ:

  • добавить новый элемент в конец очереди;

  • удалить из очереди первый элемент;

  • получить доступ к крайним элементам.

  • Представление в виде «кольцевого» массива с размером QUEUESIZE:

рис.6. Очередь в виде «кольцевого» массива

Const

QUEUESIZE =…

Tyре

Queue=record

OBJ:array[0..QUEUESIZE] of real;

{указатели на первый и последний элементы}

FRONT, REAR: 0..QUEUESIZE;

End;

Var

Q:QUEUE;

  1. В описании типа QueueмассивOBJначинается с 0, т.е. массив значений содержитQUEUESIZE+1компонент.

  2. Так как начало и конец очереди непрерывно перемещаются в пределах массива, удобно представить массив в виде кольца. Для обхода «по кольцу» используется операция mod. ЕслиREAR<QUEUESIZE-1, то он увеличивается обычным способом. ЕслиREARравенQUEUESIZE-1, то он сбрасывается в0:

REAR+1=(QUEUESIZE-1)+1=QUEUESIZE

QUEUESIZE mod QUEUESIZE=0

  1. Элемент QUEUESIZEне используется для хранения значений.

  2. При добавлении узла проверяется, что существует более 1 свободной позиции между FRONTиREAR(условиеREAR=FRONT, перед проверкойREAR увеличивается на 1). Если существует только одна свободная позиция,очередь заполнена.

  • Добавление объекта в очередь

ЕСЛИ Памяти нет ТО

Переполнение

ИНАЧЕ

Добавить узел в конец очереди

Записать Х в последний узел

ВСЕ ЕСЛИ

  • Удаление объекта из очереди

ЕСЛИ Очередь пуста ТО

Нехватка

ИНАЧЕ

Переписать содержимое из узла - начала очереди в X

Удалить узел из начала очереди

ВСЕ ЕСЛИ

Procedure ADDQ (var Q:QUEUE; NEWOBJ:REAL);

Begin

With Q do

Begin

REAR:= (REAR+1) mod QUEUESIZE;

if REAR=FRONT then

WRITELN(‘Очередь полна')

Else

OBJ[REAR]:=NEWOBJ

End

End; (* процедуры ADDQ *)

procedure DELETEQ (var Q:QUEUE; var OLDOBJ:REAL);

Begin

with Q do

if REAR=FRONT then

WRITELN('Очередь пуста')

Else

Begin

FRONT:=(FRONT+1) mod QUEUESIZE;//сравните с псевдокодом

OLDOBJ:=OBJ[FRONT]

End

End; (* процедуры DELETEQ *)

Представление очереди в связанной памяти (в виде односвязного списка)

рис.7. Очередь в связанной памяти

  • FRONT,REAR- указатели на начало и конец очереди соответственно. Если очередь пуста, тоFRONT=REAR=nil.

Type

QUEUE=^Node;

Node=record

Info:Real;

Next:QUEUE

End;

Var

FRONT, REAR: QUEUE;

Procedure ADDQ (Var Start,Fin:Queue; item:Integer);

Var

newnode:Queue;

begin

new(newnode);

newnode^.info := item;

newnode^.next:=nil;

if Start = Nil then

begin

start := newnode;

fin:= newnode;

end

else

begin

fin^.next:=newnode;

fin:=newnode;

end;

end;

  • В процедуре добавления (ADDQ) не включена проверка переполнения памяти.

Function DELETEQ(Var start, fin:Queue; var error:Integer):Integer;

Var

Value : Integer;

oldhead:Queue;

begin

value := 0;

if start=nil then error := 1

else

begin

oldhead := start;

value:= oldhead^.info;

start:= start^.next;

if start=nil then fin:=nil;

Freemem(oldhead, sizeof(Queue));

error := 0;

End;

DELETEQ:=value;

end;

  • Функция удаления (DELETEQ), помимо значения удаленного узла (value), возвращает код ошибки (error), соответствующий отсутствию элемента в очереди.

ДЕКИ

  • ДЕК (DEQUE, Double-Ended Queue - двусторонняя очередь)

Линейный список, в котором операции включения и исключения элементов (и обычно всякий доступ) разрешены на обоих концах.

  • Если операция включения(исключения) разрешена только на одном конце списка, то такой дек называютдеком с ограниченным входом(выходом).

А)

B)

рис.8. Представления дека: А) полный дек в непрерывной памяти; B) дек с ограниченным выходом в связанной памяти.

  • В статической памяти физическая структура дека идентична структуре кольцевой очереди, а сам дек можно рассматривать как объединение двух очередей, в первой из которых указатель на начало - LEFT, а на конец - RIGHT, а во второй – наоборот (рис. 8А).

  • Динамическая реализация дека с ограниченным выходом является объединением стека и очереди (рис. 8B).