Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Турбо Паскаль (паскалер).doc
Скачиваний:
19
Добавлен:
03.05.2019
Размер:
2.65 Mб
Скачать

Стек Занятие 1. Стек. Отличия стека от списка. Основные операции со стеком.

На предыдущих занятиях мы уже рассматривали однонаправленный список. Здесь Вы познакомитесь с двумя разновидностями обычного линейного списка – стеком и очередью. В программировании наиболее часто используемой структурой является стек.

Стек – это линейный список, в котором добавление новых элементов и удаление существующих производится только с одного конца, называемого вершиной стека.

Стек часто называют структурой LIFO [сокращение LIFO означает Last In – First Out (последний пришел, первый вышел)]. Это сокращение представляет удобный способ запомнить механизм работы стека

Изобразим стек графически:

При программировании на Паскале стек реализуется чаще всего в виде однонаправленного списка. Каждый элемент структуры содержит указатель на следующий. Считается лишь, что для этого списка не существует обход элементов. Доступ возможен только к верхнему элементу структуры.

Стек предполагает вставку и удаление элементов, поэтому он является динамической, постоянно меняющейся структурой.

Стеки довольно часто встречаются в практической жизни. Простой пример: детская пирамидка. Процесс ее сборки и разборки подобен процессу функционирования стека.

Итак, если стек – это список, то добавление или извлечение элементов происходит с начала и только с начала (или возможно с конца и только с конца) списка.

Значением указателя, представляющего стек, является ссылка на вершину стека, каждый элемент стека содержит поле ссылки.

Таким образом, описать стек можно следующим образом:

Type

EXST = ^ST;

ST = record

Data : integer;

Next : EXST;

end;

Var

Stack : EXST; {Текущая переменная}

Если стек пуст, то значение указателя равно Nil.

Рассмотрим возможные операции со стеком.

Занесение элемента в стек

Занесение элемента в стек производится аналогично вставке нового элемента в начало списка. Процедура занесения элемента в стек должна содержать два параметра: первый задает вершину стека, в который нужно занести элемент, второй – заносимое значение элемента стека.

Процедура формирования стека будет иметь следующий вид:

Procedure FormStack;

Var

Stack : EXST; {Текущая переменная}

Digit : integer;

Procedure writeStack(Var u : EXST; Digit : integer);

Var

x : EXST;

Begin

new(x); {выделяем память под хранение нового элемента стека}

x^.Data := Digit; {заполняем поле данных элемента}

x^.Next := u; {новый элемент "связываем" со стеком}

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

End;

Begin

Stack := Nil; {инициализация стека}

writeln('Введите элементы стека. Окончание ввода – 0');

read(Digit);

while Digit <> 0 do

begin

writeStack(Stack, Digit);

read(Digit);

end;

End;

Извлечение элемента из стека

В результате выполнения этой операции некоторой переменной i должно быть присвоено значение первого элемента стека и значение указателя на начало списка должно быть перенесено на следующий элемент стека.

Procedure readStack(Var u : EXST; Var i : integer);

Var

x : EXST;

Begin

i := u^.Data; {считываем значение поля данных в переменную}

x := u; {запоминаем адрес вершины стека}

u := u^.Next; {переносим вершину стека на следующий элемент}

dispose(x); {освобождаем память, занятую уже ненужным элементом стека}

End.

Недостатком описанной процедуры является предположение о том, что стек не пуст. Для его исправления следует разработать логическую функцию проверки пустоты обрабатываемого стека.

Function FreeStack(u : EXST) : boolean;

Задание. Описать функцию и закончить программу, для чего описать процедуру вывода значений элементов стека на экран (она аналогична выводу списка). Протестировать программу, дополнить комментарием и показать файл и листинг учителю для оценки.

Чтобы наглядно рассмотреть работу стека, наберите следующую программу.

Program Demidenko;

Uses

Crt, Graph;

Type

sp=^spis;

ecord

elem : byte;

next : sp;

End;

Var

a, b : byte;

s : string;

gd, gm, c : integer;

head, some, x : sp;

bol : boolean;

ch : char;

Procedure OutX(x, y : integer);

Begin

Line(x+50,y+10,x+70,y+10);

Line(x+50,y+10,x+55,y+10-3);

Line(x+50,y+10,x+55,y+10+3);

Line(x+55,y+13,x+55,y+10-3);

OutTextXY(x+70,y+10,'x');

End;

Procedure Wiv (x, y : integer; ss : sp);

Begin

Line(x,y,x+50,y);

Line(x,y,x,y+20);

Line(x,y+20,x+50,y+20);

Line(x+50,y,x+50,y+20);

Line(x+30,y,x+30,y+20);

if some=ss

then

Begin

Line(x+50,y+10,x+70,y+10);

Line(x+50,y+10,x+55,y+10-3);

Line(x+50,y+10,x+55,y+10+3);

Line(x+55,y+13,x+55,y+10-3); End;

Str(ss^.elem, s);

OutTextXY(x+10,y+10,s);

if (ss^.next<>nil)

then

Begin

Line(x+40,y+10,x+40,y+40);

Line(x+40,y+40,x+37,y+40-5);

Line(x+40,y+40,x+43,y+40-5);

Line(x+43,y+40-5,x+37,y+40-5);

Wiv(x,y+40,ss^.next);

End

else

Begin

Line(x+40,y+10,x+40,y+30);

Line(x+40,y+30,x+37,y+25);

Line(x+40,y+30,x+43,y+25);

Line(x+43,y+25,x+37,y+25);

Line(x+35,y+32,x+45,y+32);

Line(x+36,y+35,x+44,y+35);

Line(x+38,y+38,x+42,y+38);

End;

End;

Procedure Insertsp(x : byte);

Begin

Cleardevice;

OutTextXY(50,20,'NEW(X)');

new(some);

Line(20,100,20+50,100);

Line(20,100,20,100+20);

Line(20,100+20,20+50,100+20);

Line(20+50,100,20+50,100+20);

Line(20+30,100,20+30,100+20);

Outx(20,100);

if head<>nil

then

Wiv(20,140,head);

Delay(1000);

Cleardevice;

OutTextXY(50,20,'X^.NEXT:=TAIL');

OutTextXY(50,40,'TAIL:=X');

some^.next:=head;

head:=some;

Wiv(20,100,head);

Delay(1000);

Cleardevice;

Str(x,s);

OutTextXY(50,20,'SOME^.ELEM:='+s);

some^.elem:=x;

Wiv(20,100,head);

Delay(1000);

End;

Procedure DelSp;

Begin

Cleardevice;

if head=nil

then

Begin

Y(50,20,'Элемент не существует!');

Delay(1000);

End

else

if head^.next<>nil

then

Begin

OutTextXY(50,20,'X:=TAIL');

OutTextXY(50,40,'TAIL:=TAIL^.NEXT');

some:=some^.next;

Wiv(20,100,head);

OutX(20,100);

Delay(1000);

Cleardevice;

OutTextXY(50,20,'DISPOSE(X)');

Wiv(20,100,head);

OutX(20,100);

Setcolor(red);

Line(20,90,70,130);

Line(70,90,20,130);

Setcolor(white);

Delay(1000);

Cleardevice;

head:=head^.next;

some:=head;

Wiv(20,100,head);

End

else

Begin

OutTextXY(50,20,'DISPOSE(TAIL)');

Wiv(20,100,head);

Setcolor(red);

Line(20,90,70,130);

Line(70,90,20,130);

Setcolor(white);

Delay(1000);

ClearDevice;

head:=nil;

some:=head;

End;

End;

Begin

ClrScr;

bol:=false;

gD := Detect;

InitGraph(gD, gM,'c:\tp7\bgi\');

TextBackGround(black);

Setbkcolor(black);

Head:=nil;

Some:=head;

Repeat

OutTextXY(250,200,'1 * Добавить элемент');

OutTextXY(250,220,'2 * Удалить элемент');

OutTextXY(250,240,'Esc Выход');

ch:=readkey;

case ch of

'1' : Begin

OutTextXY(250,260,'Введите число:');

gotoxy(48,17);

readln(b);

InsertSp(b);

End;

'2' : delsp;

#27 : Begin

CloseGraph;

Halt;

End;

End;

until bol;

CloseGraph;

End.

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