
- •Адресные типы
- •Использование динамической памяти
- •Линейные списки
- •Формы представления линейных списков в оперативной памяти
- •Стеки, очереди, деки
- •Представление стека в непрерывной памяти (в виде массива)
- •Представление стека в связанной памяти (в виде односвязного списка)
- •Очереди
- •Представление очереди в непрерывной памяти (в виде массива)
- •Представление очереди в связанной памяти (в виде односвязного списка)
- •Односвязный список
- •Двусвязный список
- •Кольцевые списки
- •Сортировка с помощью прямого выбора
- •Сортировка с помощью прямого обмена (пузырьковая)
- •Оценка затрат на поиск элемента
Стеки, очереди, деки
Выберем для линейного списка операции получения доступа, добавления и удаления i-го узла, разрешив их только на концах списка (i=1, i=n) и, в зависимости от допустимого набора операций, определим ряд списковых структур.
СТЕКИ
Более подробно см.: 519 П68 Прайс Д. Программирование на языке Паскаль.-М.:Мир,1987.
СТЕК (Stack, дисциплина обслуживания LIFO, Last-In-First-Out - "последним пришел – первым ушел")
Линейный список, в котором включение и исключение элементов (и обычно всякий доступ) выполняются только с одной его стороны, называемой вершиной [стека].
БАЗОВЫЕ ОПЕРАЦИИ:
Добавить элемент в стек (Push, втолкнуть)
Удалить последний добавленный в стек элемент (Pop, вытолкнуть - чтение с разрушением)
Получить значение элемента в вершине стека, не изменяя сам стек (Peek, выбрать).
ПРОЦЕДУРЫ ДОБАВЛЕНИЯ И УДАЛЕНИЯ ЭЛЕМЕНТА В СТЕКЕ:
ЕСЛИ памяти нет ТО Переполнение ИНАЧЕ Добавить новый узел в вершину стека Записать Х в вершину стека ВСЕ-ЕСЛИ |
ЕСЛИ стек пуст ТО Нехватка ИНАЧЕ Переписать содержимое из узла вершины в X Исключить узел из вершины стека ВСЕ-ЕСЛИ |
Представление стека в непрерывной памяти (в виде массива)
[Д. Прайс, стр. 178-180]
рис.3. Стек в последовательной памяти |
Const STACKSIZE=…; Type STACK= record OBJ:array[1..STACKSIZE] of Real; TOP: 0.. STACKSIZE; End; Var S:Stack; |
Массив S.OBJ содержит элементы стека.
S.TOP - указатель для определения текущего размера (уровня заполнения) стека. Если стек пуст, то S.TOP=0.
Если стек содержит от 1 до STACKSIZE объектов, то S.TOP показывает на верхний элемент стека в пределах массива.
procedure PUSH (var S:STACK; NEWOBJ:REAL); begin if S.TOP=STACKSIZE then WRITELN('Стек заполнен.') else begin S.TOP:= S.TOP+1; S.OBJ[S.TOP]:=NEWOBJ end end; |
procedure POP (var S:STACK; var OLDOBJ:REAL); begin if S.TOP=0 then WRITELN('Стек пуст') else begin OLDOBJ:=S.OBJ[S.TOP]; S.TOP:=S.TOP–1 end end; |
Представление стека в связанной памяти (в виде односвязного списка)
рис.4. Стек в связанной памяти |
Type STACK=^Node; Node=record Info:Real; // поле данных Next:Stack // поле-ссылка End; Var TOP:Stack // вершина стека
|
|
|
|
|
Procedure PUSH(var S:Stack;item:integer); Var NewItem:Stack; begin New(newitem); NewItem^.Info:=item; NewItem^.next:=s; s:=NewItem; end;
|
Procedure POP (var S:STACK; var OLDOBJ:REAL); var Old:Stack; begin if s=Nil then WRITELN('CТЕК ПУСТ') else begin OLDOBJ:=S^.info; Old:=S; S:=S^.next; Dispose(old); End end; |
ЗАДАНИЕ 1. Самостоятельно напишите процедуры просмотра значения в вершине стека (Peek) для его реализации в непрерывной и связанной памяти.