
- •Линейные списки
- •Стеки, очереди, деки
- •Представление стека в непрерывной памяти (в виде массива)
- •Представление стека в связанной памяти (в виде односвязного списка)
- •Очереди
- •Представление очереди в непрерывной памяти (в виде массива)
- •Представление очереди в связанной памяти (в виде односвязного списка)
- •Оценка затрат на поиск элемента
- •Деревья
- •Бинарные деревья
- •Сбалансированные и идеально сбалансированные деревья. Деревья поиска
Представление очереди в непрерывной памяти (в виде массива)
[Д. Прайс, стр. 181-183]
рис.5. Очередь в непрерывной памяти |
|
Представление в виде «кольцевого» массива с размером QUEUESIZE:
рис.6. Очередь в виде «кольцевого» массива |
Const QUEUESIZE =… Tyре Queue=record OBJ:array[0..QUEUESIZE] of real; {указатели на первый и последний элементы} FRONT, REAR: 0..QUEUESIZE; End; Var Q:QUEUE; |
В описании типа QueueмассивOBJначинается с 0, т.е. массив значений содержитQUEUESIZE+1компонент.
Так как начало и конец очереди непрерывно перемещаются в пределах массива, удобно представить массив в виде кольца. Для обхода «по кольцу» используется операция mod. ЕслиREAR<QUEUESIZE-1, то он увеличивается обычным способом. ЕслиREARравенQUEUESIZE-1, то он сбрасывается в0:
REAR+1=(QUEUESIZE-1)+1=QUEUESIZE
QUEUESIZE mod QUEUESIZE=0
Элемент QUEUESIZEне используется для хранения значений.
При добавлении узла проверяется, что существует более 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. Очередь в связанной памяти
|
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;
|
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;
|
ДЕКИ
ДЕК (DEQUE, Double-Ended Queue - двусторонняя очередь)
Линейный список, в котором операции включения и исключения элементов (и обычно всякий доступ) разрешены на обоих концах.
Если операция включения(исключения) разрешена только на одном конце списка, то такой дек называютдеком с ограниченным входом(выходом).
-
А)
B)
рис.8. Представления дека: А) полный дек в непрерывной памяти; B) дек с ограниченным выходом в связанной памяти.
В статической памяти физическая структура дека идентична структуре кольцевой очереди, а сам дек можно рассматривать как объединение двух очередей, в первой из которых указатель на начало - LEFT, а на конец - RIGHT, а во второй – наоборот (рис. 8А).
Динамическая реализация дека с ограниченным выходом является объединением стека и очереди (рис. 8B).