Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
К2_Допматериалы_15апр.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.99 Mб
Скачать

Стеки, очереди, деки

Выберем для линейного списка операции получения доступа, добавления и удаления i-го узла, разрешив их только на концах списка (i=1, i=n) и, в зависимости от допустимого набора операций, определим ряд списковых структур.

СТЕКИ

  • Более подробно см.: 519 П68 Прайс Д. Программирование на языке Паскаль.-М.:Мир,1987.

  • СТЕК (Stack, дисциплина обслуживания LIFO, Last-In-First-Out - "последним пришел – первым ушел")

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

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

  • Добавить элемент в стек (Push, втолкнуть)

  • Удалить последний добавленный в стек элемент (Pop, вытолкнуть - чтение с разрушением)

  • Получить значение элемента в вершине стека, не изменяя сам стек (Peek, выбрать).

  • ПРОЦЕДУРЫ ДОБАВЛЕНИЯ И УДАЛЕНИЯ ЭЛЕМЕНТА В СТЕКЕ:

  • Добавление объекта в стек

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

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

ИНАЧЕ

Добавить новый узел в вершину стека

Записать Х в вершину стека

ВСЕ-ЕСЛИ

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

ЕСЛИ стек пуст ТО

Нехватка

ИНАЧЕ

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

Исключить узел из вершины стека

ВСЕ-ЕСЛИ

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

[Д. Прайс, стр. 178-180]

рис.3. Стек в последовательной памяти

  • Стек с максимальным размером STACKSIZE можно, например, организовать так:

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 // вершина стека

  • TOP - указатель на вершину стека. Если стек пуст, то TOP=nil.

  • Добавление объекта в стек

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

Procedure PUSH(var S:Stack;item:integer);

Var

NewItem:Stack;

begin

New(newitem);

NewItem^.Info:=item;

NewItem^.next:=s;

s:=NewItem;

end;

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

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) для его реализации в непрерывной и связанной памяти.