• 1. Абстрактные структуры данных
  • 2. Стеки
  • 3. Очереди
  • ЛЕКЦИЯ № 8. Абстрактные структуры данных

    1. Абстрактные структуры данных

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

    Часто требуется, чтобы структуры данных меняли свои размеры в ходе решения задачи. Такие структуры данных называются динамическими. К ним относятся стеки, очереди, списки, деревья и др.

    Описание динамических структур с помощью массивов, записей и файлов приводит к неэкономному использованию памяти ЭВМ и увеличивает время решения задач.

    Каждая компонента любой динамической структуры представляет собой запись, содержащую, по крайней мере, два поля: одно поле типа «указатель», а второе – для размещения данных. В общем случае запись может содержать не один, а несколько указателей и несколько полей данных. Поле данных может быть переменной, массивом, множеством или записью.

    Если в указующей части содержится адрес одного элемента списка, то список называется однонаправленным (или односвязным). Если же он содержит две компоненты, то двусвязным. Над списками можно проводить различные операции, например:

    1) добавление элемента к списку;

    2) удаление элемента из списка с заданным ключом;

    3) поиск элемента с заданным значением ключевого поля;

    4) сортировка элементов списка;

    5) деление списка на два и более списков;

    6) объединение двух и более списков в один;

    7) другие операции.

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

    2. Стеки

    Стеком называется динамическая структура данных, добавление компоненты в которую и исключение компоненты из которой производится из одного конца, называемого вершиной стека. Стек работает по принципу LIFO(Last-In, First-Out) – «Поступивший последним, обслуживается первым».

    Обычно над стеками выполняется три операции:

    1) начальное формирование стека (запись первой компоненты);

    2) добавление компоненты в стек;

    3) выборка компоненты (удаление).

    Для формирования стека и работы с ним необходимо иметь две переменные типа «указатель», первая из которых определяет вершину стека, а вторая – вспомогательная.

    Пример. Составить программу, которая формирует стек, добавляет в него произвольное количество компонент, а затем читает все компоненты и выводит их на экран дисплея. В качестве данных взять строку символов. Ввод данных – с клавиатуры, признак конца ввода – строка символов END.

    Program STACK;

    uses Crt;

    type

    Alfa = String[10];

    PComp = ^Comp;

    Comp = Record

    sD : Alfa;

    pNext : PComp

    end;

    var

    pTop : PComp;

    sC : Alfa;

    Procedure CreateStack(var pTop : PComp; var sC : Alfa);

    begin

    New(pTop);

    pTop^.pNext := NIL;

    pTop^.sD := sC;

    end;

    Procedure AddComp(var pTop : PComp; var sC : Alfa);

    var pAux : PComp;

    begin

    NEW(pAux);

    pAux^.pNext := pTop;

    pTop := pAux;

    pTop^.sD := sC;

    end;

    Procedure DelComp(var pTop : PComp; var sC : ALFA);

    begin

    sC := pTop^.sD;

    pTop := pTop^.pNext;

    end;

    begin

    Clrscr;

    writeln(' ВВЕДИ СТРОКУ ');

    readln(sC);

    CreateStack(pTop, sC);

    repeat

    writeln(' ВВЕДИ СТРОКУ ');

    readln(sC);

    AddComp(pTop, sC);

    until sC = 'END';

    writeln('****** ВЫВОД РЕЗУЛbТАТОВ ******');

    repeat

    DelComp(pTop, sC);

    writeln(sC);

    until pTop = NIL;

    end.

    3. Очереди

    Очередью называется динамическая структура данных, добавление компоненты в которую производится в один конец, а выборка осуществляется с другого конца. Очередь работает по принципу FIFO (First-In, First-Out) – «Поступивший первым, обслуживается первым».

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

    Пример. Составить программу, которая формирует очередь, добавляет в нее произвольное количество компонент, а затем читает все компоненты и выводит их на экран дисплея. В качестве данных взять строку символов. Ввод данных – с клавиатуры, признак конца ввода – строка символов END.

    Program QUEUE;

    uses Crt;

    type

    Alfa = String[10];

    PComp = ^Comp;

    Comp = record

    sD : Alfa;

    pNext : PComp;

    end;

    var

    pBegin, pEnd : PComp;

    sC : Alfa;

    Procedure CreateQueue(var pBegin,pEnd:PComp; var sC:Alfa);

    begin

    New(pBegin);

    pBegin^.pNext := NIL;

    pBegin^.sD := sC;

    pEnd := pBegin;

    end;

    Procedure AddQueue(var pEnd : PComp; var sC : Alfa);

    var pAux : PComp;

    begin

    New(pAux);

    pAux^.pNext := NIL;

    pEnd^.pNext := pAux;

    pEnd := pAux;

    pEnd^.sD := sC;

    end;

    Procedure DelQueue(var pBegin : PComp; var sC : Alfa);

    begin

    sC := pBegin^.sD;

    pBegin := pBegin^.pNext;

    end;

    begin

    Clrscr;

    writeln(' ВВЕДИ СТРОКУ ');

    readln(sC);

    CreateQueue(pBegin, pEnd, sC);

    repeat

    writeln(' ВВЕДИ СТРОКУ ');

    readln(sC);

    AddQueue(pEnd, sC);

    until sC = 'END';

    writeln(' ***** ВЫВОД РЕЗУЛbТАТОВ *****');

    repeat

    DelQueue(pBegin, sC);

    writeln(sC);

    until pBegin = NIL;

    end.









    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Вверх