Реферат: Динамические структуры данных: стеки

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

Поопределению, элементы извлекаются из стека в порядке, обратном их добавлению вэту структуру, т.е. действует принцип «последний пришёл — первыйушёл».

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

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

Выделимтиповые операции над стеком и его элементами:

добавлениеэлемента в стек;

удалениеэлемента из стека;

проверка,пуст ли стек;

просмотрэлемента в вершине стека без удаления;

очисткастека.

Реализуемэти операции, используя разработанный ранее модуль для однонаправленных списков(см. материал «Динамические структуры данных: списки»).

{ Turbo Pascal, файл STACK.PAS }

Unit Stack;

Interface

 Uses Spisok;

 Procedure V_Stack(Var Versh: U; X: BT);

 Procedure Iz_Stack(Var Versh: U; Var X: BT);

 Function Pust(Versh: U): Boolean;

 Function V_Vershine(Versh: U): BT;

 Procedure Ochistka(Var Versh: U);

Implementation

 Procedure V_Stack;

 Begin

     V_Nachalo(Versh, X)

 End;

 Procedure Iz_Stack;

 Begin

     Iz_Nachala(Versh, X)

 End;

 Function Pust;

 Begin

     Pust := Versh = Nil

 End;

 Function V_Vershine;

 Begin

      V_Vershine := Versh^.Inf

 End;

 Procedure Ochistka;

 Begin

      Spisok.Ochistka(Versh)

 End;

Begin

End.

/* C++, файл STACK.CPP */

#include «SPIS.CPP»

Zveno *V_Stack(Zveno *Versh, BT X)

{

 return V_Nachalo(Versh, X);

}

Zveno *Iz_Stack(Zveno *Versh)

{

 return Iz_Nachala(Versh);

}

int SPust(Zveno *Versh)

{

            return !Versh;

}

BT V_Vershine(Zveno *Versh)

{

            return Versh->Inf;

}

Zveno *Chistka(Zveno *Versh)

{

while (!Pust(Versh)) Versh=Iz_Stack(Versh);

                        return Versh;

}

Используяразработанные здесь библиотеки, решим задачу.

Пример.Написать программу, которая вычисляет как целое число значение выражений (безпеременных), записаных (без ошибок) в постфиксной форме в текстовом файле.Каждая строка файла содержит ровно одно выражение.

Алгоритмрешения. Выражение просматривается слева направо. Если встречается число, тоего значение (как целое) заносится в стек, а если встечается знак операции, тоиз стека извлекаются два последних элемента (это операнды данной операции), надними выполняется операция и ее результат записывается в стек. В конце в стекеостается только одно число — значение всего выражения.

{ Turbo Pascal, файл ST2.PAS }

 Program St2;

 Uses Spisok, Stack;

 Const Znak = ['+', '-', '*', '/'];

 Var S, S1: String;

     T: Text;

     I, N: Byte;

     X, Y: BT; Code: Integer;

     NS: U;

 Begin

   Write('Введите имя файла: ');   ReadLn(S1);

   Assign(T, S1);   ReSet(T);

   NS := Nil;

   While Not Eof(T) Do

    Begin

      ReadLn(T, S);  I := 1;

      While I <= Length(S) Do

        Begin

          If S[I] In ['0'..'9']

          Then

          Begin

           N := I;

           While S[I] In ['0'..'9'] Do

            I := I + 1;

           Val(Copy(S, N, I — N), X, Code);

          V_Stack(NS, X);

          End

          Else

          If S[I] In Znak

          Then

           Begin

             Iz_Stack(NS, X);

             Iz_Stack(NS, Y);

             Case S[I] Of

             '+': X := X + Y;

             '-': X := Y — X;

             '*': X := X * Y;

             '/': X := Y Div X

             End;

             V_Stack(NS, X)

           End;

          I := I + 1

         End;

         Iz_Stack(NS, X);

         WriteLn(S, ' = ', X);

       End

   End.

Список литературы

Дляподготовки данной работы были использованы материалы с сайта www.comp-science.ru/

еще рефераты
Еще работы по информатике, программированию