Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабPaб3.doc
Скачиваний:
6
Добавлен:
21.02.2016
Размер:
1.27 Mб
Скачать

4.5. Стек

Стек є одним з найпоширеніших видів лінійного списку. Стек — це список, в якому додавання нових елементів і витягання їх відбувається з початку списку (званою вершиною стека). Значенням покажчика, що представляє стек, є посилання на вершину стека, кожний елемент стека містить поле посилання. Елемент-посилання нижнього (тобто останнього) вузла встановлюється в nil, відзначаючи «дно» стека.

Стек називають структурою типу LIFO (last-in, first-out — «останнім ввійшов, першим вийшов»). Розташування елементів в стеку показано нижче на малюнку. Опис окремих елементів стека і його формування в цілому може бути реалізований аналогічно списку. При цьому до стека застосовні всі розглянуті вище процедури пошуку, вставки і видалення елементів.

Примітка. Стеки знаходять багато цікавих застосувань. Наприклад, коли програма викликає деяку підпрограму, підпрограма, що викликається, повинна знати, як повернути управління тій що викликає. Тому адреса повернення програми, що викликається, розміщується в стек виконання програми. Коли відбуваються вкладені виклики, послідовні адреси повернення поміщаються в стек за принципом «останнім ввійшов — першим вийшов», так що кожна підпрограма може повернути управління своєї викликаємої.

При кожному виклику підпрограми під час виконання програми в її стеку виділяється пам'ять для зберігання локальних змінних. Коли підпрограма повертає управління викликає, область локальних змінних підпрограми віддаляється із стека, і його змінні втрачаються для програми.

u

N-й элемент

datan

nextn-1

Вершина стека

(N-1) –й элемент

datan-1

next n-2

.. . .

. . . .

2-й элемент

data2

next1

1-й элемент

data1

nil

Дно стека

Мал. Розташування елементів в стеку

Приклад 4. Скласти програму формування стека, що містить цілі числа 1, 2, 3, 4, 5. Як тільки буде введено останнє число 5, вміст стека виводиться на екран. Далі, з вершини стека вибирається одне число і на екран виводиться вибране число і вміст стека. Дана програма виглядає таким чином:

Program pr7;

type ptr=^st;

st=record

data: integer;

next:ptr;

end;

var stack:ptr; d,i_stacka,c,i: integer;

{$i print.pas} {Директива включения в компиляцию с текущего каталога файла print.pas }

procedure WrStack (var u:ptr; d:integer); {Занесение в стек}

var x:ptr;

begin

new(x); {создание нового элемента стека}

x^.data:=d;

x^.next:=u; {созданный элемент определить как вершину стека}

u:=x;

end;

{-------------------------------}

procedure ReadStack(var u:ptr; var i:integer); {Извлечение из стека}

Задание: Для самоконтроля усвоения рассмотренного материала прорисуйте изменение значений элементов стека и переменных: stack, u и x

var x: ptr;

begin

i:=u^.data;

x:=u;

u:=u^.next;

dispose(x);

end;

{-------------------------------}

Begin

Протокол работы программы

Стек -> 5 4 3 2 1

Из стека->5

Стек -> 4 3 2 1

stack:=nil;

for i:=1 to 5 do WrStack(stack,i);

write('Стек -> '); print(stack);

ReadStack(stack,i_stacka);

writeln('Из стека->',i_stacka);

write('Стек -> ');print(stack);

End.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]