Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций СиАОД.docx
Скачиваний:
15
Добавлен:
01.03.2025
Размер:
4.62 Mб
Скачать
    1. Атд «Список»

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

  • a1,a2,…,an, где n ≥0

  • a1 – первый элемент списка

  • an – последний элемент списка

  • n длина списка

Обозначения

  • L - список объектов типа elementtype

  • x – объект этого типа

  • p – позиция элемента в списке

  • Функция END (L) возвращает позицию, следующую за позицией n в n- элементном списке L.

Операции над списками

1. Оператор INSERT ( x,p,L) – вставляет объект x в позицию p в списке L. Если в списке L нет позиции p, то результат этого оператора не определен.

2. Функция LOCATE (x,L) – возвращает позицию первого объекта x в списке L. Если объекта x нет в списке L, то возвращается END(L).

3. Функция RETRIEVE (p,L) – возвращает элемент, который стоит в позиции p в списке L. Результат не определен, если в списке L нет позиции p, или если p= END(L).

4. Оператор DELETE ( p,L) – удаляет элемент в позиции p списка L. Результат не определен, если в списке L нет позиции p, или если p= END(L).

5. Функции NEXT(p, L) и PREVIOUS(p,L) – возвращают соответственно следующую и предыдущую позиции от позиции p в списке L. Функция NEXT не определена, если p= END(L). Функция PREVIOUS не определена, если p= 1. Обе функции не определены, если в списке L нет позиции p.

6. Функция MAKENULL (L) – делает список L пустым и возвращает позицию END(L).

7. Функция FIRST (L) – возвращает первую позицию в списке L. Если список пустой, то возвращается позиция END(L).

8. Оператор PRINTLIST ( L) – печатает элементы списка L в порядке их расположения.

    1. Атд «Стек»

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

Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкиванием (pop), тоже возможно только из вершины стека, при этом второй сверху элемент становится верхним.

Реализация стеков массивами

  • stak – массив, используемый для организации стека;

  • stksiz – размер массива;

  • stktop – указатель вершины стека;

  • data - данные;

  • pr – признак успешности операции

Включить в стек

  • procedure push(var stak:massiv; stksiz:integer; var stktop:integer; data:integer; var pr:boolean);

  • begin

  • {vkl}

  • if stktop >= stksiz then pr:=false

  • else

  • begin

  • stktop:=stktop+1;

  • stak[stktop]:= data;

  • pr:=true

  • end;

  • end;

Исключить из стека

  • procedure pop(var stak:massiv; stksiz:integer; var stktop:integer;var data:integer; var pr:boolean);

  • begin

  • {iskl}

  • if stktop = 0 then pr:=false

  • else

  • begin

  • data:= stak[stktop];

  • stktop:=stktop+1;

  • pr:=true

  • end;

  • end;

Очередь (FIFO)

    1. Атд «Очередь»

О́чередь — структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, First In — First Out). Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется.

Существует несколько способов реализации очереди в языках программирования.

Массив

Первый способ представляет очередь в виде массива и двух целочисленных переменных start и end.

Обычно start указывает на голову очереди, end — на элемент, который заполнится, когда в очередь войдёт новый элемент. При добавлении элемента в очередь в q[end] записывается новый элемент очереди, а end уменьшается на единицу. Если значение end становится меньше 1, то мы как бы циклически обходим массив и значение переменной становится равным n. Извлечение элемента из очереди производится аналогично: после извлечения элемента q[start] из очереди переменная start уменьшается на 1. С такими алгоритмами одна ячейка из n всегда будет незанятой (так как очередь с n элементами невозможно отличить от пустой), что компенсируется простотой алгоритмов.

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

Недостатки: максимальное количество элементов в очереди ограничено размером массива. При его переполнении требуется перевыделение памяти и копирование всех элементов в новый массив.

Связный список

Второй способ основан на работе с динамической памятью. Очередь представляется в качестве линейного списка, в котором добавление/удаление элементов идет строго с соответствующих его концов.

Преимущества данного метода: размер очереди ограничен лишь объёмом памяти.

Недостатки: сложнее в разработке; требуется больше памяти; при работе с такой очередью память сильнее фрагментируется; работа с очередью несколько медленнее.

Реализация с помощью массива

Занести в очередь

  • procedure QUEINS(var QUEUE:massiv; QUESIZ:integer; var QUEF, QUER:integer; DATA:integer; var PR:boolean);

  • begin

  • if (QUEF=QUER+1) or ((QUEF=1) and (QUER=QUESIZ)) then PR:=false

  • else

  • begin

  • PR:=true;

  • QUEUE[QUER]:= DATA;

  • QUER:=QUER+1;

  • if (QUER > QUESIZ)) then QUER:=1

  • end;

  • end;

Исключить из очереди

  • procedure QUEDEL(var QUEUE:massiv; QUESIZ:integer; var QUEF, QUER:integer; var DATA:integer; var PR:boolean);

  • begin

  • if (QUEF=QUER) then PR:=false

  • else

  • begin

  • PR:=true;

  • DATA := QUEUE[QUEF]

  • QUEF:=QUEF+1;

  • if (QUEF > QUESIZ)) then QUEF:=1

  • end;

  • end;

Инициализация очереди

  • procedure QUEINT(var QUEUE:massiv; QUESIZ:integer; var QUEF, QUER:integer; var PR:boolean);

  • begin

  • var I:integer;

  • PR:=true;

  • QUEF:=1;

  • QUER:=1;

  • for I:=1 to QUESIZ do QUEUE[I]:=0;

  • end;