Примеры решения задач.

Пример 1. Используя стек, напечатать содержимое текстового файла, выписывая литеры каждой его строки в обратном порядке.

Program MordovskihK;

Type

EXST = ^ST;

ST = record

Data : char;

Next : EXST;

End;

Var

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

i : integer;

f : text;

Stroka : string;

c : char;

Procedure writeStack(Var u : EXST; Simvol : char);

Var

x : EXST;

Begin

new(x);

x^.Data := Simvol;

x^.Next := u;

u := x;

End;

Procedure Print(Var u : EXST);

Begin

while u <> Nil

Begin

write (u^.Data);

u := u^.Next;

End;

End;

Begin

Stack := Nil;

Assign(f, 'c:\autoexec.bat');

Reset(f);

while Not Eof(f) do

Begin

readln (f, Stroka);

For i := 1 to Length(Stroka) do

writeStack(Stack, Stroka[i]);

End;

close(f);

Print(Stack);

End.

Пример 2. Написать программу, проверяющую своевременность закрытия скобок в строке символов.

Для решения задачи определим стек, элементами которого являются символы:

Type

EXST = ^ST;

ST = record

Data : char;

Next : EXST;

End;

Будем двигаться по строке а : string до ее конца. Если в процессе просмотра встретится одна из закрывающихся скобок ({, (, [ ), занесем ее в стек. При обнаружении закрывающейся скобки, соответствующей скобке, находящейся в вершине стека, последняя удаляется. При несоответствии скобок выдается сообщение об ошибке.

Пусть факт наличия ошибки хранится в переменной логического типа f, то есть f=True, пока ошибка не найдена и f=False в противном случае. Тогда условие работы цикла будет выглядеть так:

while (i<>Length(a)) and f do ...

Осталось выяснить, как определить, соответствует ли очередная закрывающаяся скобка скобке, находящейся в вершине стека. Можно заметить, что коды соответствующих друг другу скобок отличаются не более чем на 2, что можно проверить с помощью функции Ord(x)):

{ } 123–125

[ ] 91–93

( ) 40–41

Причем код открывающейся скобки меньше. То есть можно записать следующее условие соответствия:

if (Ord(a[i]–Ord(stack^.Data))<=2

then

. . .

А теперь просмотрите полный текст программы:

Program Skobki;

Type

EXST = ^ST;

ST = record

Data : char;

Next : EXST;

end;

Var

a : string;

f : boolean;

i : integer;

Procedure writeStack(Var x1 : EXST; c : integer);

Var

u : EXST;

Begin

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

u^,Data := c;

u^.Next := x1;

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

End;

Procedure DelStack(Var x1 : EXST); {процедура удаления верхнего элемента стека}

Var

u : EXST;

Begin

u := x1;

x1 := x1^.Next;

dispose(u);

End.

Procedure Solve(a : string); {процедура правильности расстановки скобок}

Var

Stack : EXST;

Begin

Stack := Nil;

i := 1;

while (i<=Length(a)) and f do

begin

if (a[i]='(') or (a[i]='{') or (a[i]='[')

then

writeStack(Stack , a[i])

else

if (a[i]=')') or (a[i]='}') or (a[i]=']')

then

if Ord(Stack ^.Data)–Ord(a[i])<=2

then

DelStack(Stack)

else

f := False;

Inc(i);

end;

End.

Begin

writeln('Введите строку');

readln(a);

f := True;

if a<>' '

then

begin

Solve(a);

if f

then

writeln('Все скобки расставлены верно')

else

writeln('Скобка ',a[i-1],' закрыта преждевременно');

end

else

writeln('Строка пуста');

readln;

End.

Задание. Объясните учителю алгоритмы решения предложенных задач.








Дата добавления: 2015-05-16; просмотров: 918;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.008 сек.