Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
вот оно.docx
Скачиваний:
6
Добавлен:
25.09.2019
Размер:
1.75 Mб
Скачать

38 Очередь lifo

Наиболее часто в программировании используются очереди второго вида

стеки. Принцип их работы – «Последний пришел – первый вышел».

В стеке доступна единственная позиция, называемая вершиной стека – это позиция, в которой находится последний по времени поступления в стек элемент.

Наиболее быстрое выполнение операций над стеком обеспечивает его представление в виде динамической цепочки звеньев (однонаправленного списка). Вершиной стека обычно является первое звено цепочки. Заглавное

звено в цепочке стека не нужно, так как в стеке доступна только его вершина.

При использовании структуры однонаправленного списка стек задается с помощью описания типа, приведенного в примере 7.7, и дополнительно может

быть введен тип указателя, представляющего стек как единую структуру, то есть ссылка на вершину стека Stek:

Type

<Задание стека по примеру 7.7>; Stek = Adres1;

Реальный стек вводится с помощью описания переменной:

Q^.Element := El;

Q^.Adrcled := St; St := Q

End;

Номера операторов в данной программе соответствуют номерам этапов

алгоритма занесения элемента в стек.

Б. Выбор элемента из стека

Пусть в программе имеется описание типа, приведенное в примере 7.7.

Алгоритм выбора элемента из стека:

Прочитать значение из вершины стека.

Запомнить ссылку на старую вершину. Исключить первое звено из стека. Уничтожить первое звено.

Пример 7.14.

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

Procedure Vibor (Var St: Stek; Var A: <Тип_элементов_стека>);

Var

Q: Adres1; Begin

A := St^.Element;

Q := St;

St := St^.Adrcled; Dispose (Q)

End;

Номера операторов в данной программе соответствуют номерам этапов

алгоритма выбора элемента из стека.

Если необходимо ускорить процедуру выбора, то операторы Q := St и

Dispose(Q) можно не применять. Однако это приведет к неэффективному использованию памяти.

В. Создание стека

Пусть в программе имеется описание типа, приведенное в примере 7.7.

Для создания стека может быть использована процедура Zanes из примера

Пример 7.15.

Создание стека. Ввод исходного текста в стек. Признак окончания текста– точка.

Var

St: Adres1; Bykva: Char;

Begin

St := Nil;

Read (Bykva);

While Bykva <>’. Do Begin

Zanes (St, Bykva);

Read (Bykva) End

End.

39 Очередь fifo

Принцип работы – “Первый пришел, первый вышел”.

Для организации такой очереди используются две ссылочные переменные типа Adres1 (см. пример 7.7): Left – для указания начала и Right – для указания

конца очереди.

Добавление элемента в очередь осуществляется в соответствии со значением Right. Затем значение Right изменяется и указывает на последний

занесенный элемент.

Выборка элементов из очереди происходит, исходя из значения Left.

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

Если в очереди один элемент, значение Right равно значению Left. Такое

Равенство может использоваться как признак окончания очереди при последовательном выборе элементов из нее.

А. Занесение элемента в очередь

Пусть в программе имеется описание типа, приведенное в примере 7.7.

Алгоритм занесения элемента в очередь:

Cоздание нового звена.

Занесение в последнее звено адреса нового звена.

Занесение Nil в поле Adrcled нового звена.

Занесение элемента в информационное поле нового звена.

Созданное звено сделать концом очереди.

Пример 7.16.

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

Procedure Dobavl (Var Right: Adres1; El: <Тип_элементов_очереди>);

Var Q: Adres1; Begin

New (Q);

Right^.Adrcled := Q; Q^.Adrcled := Nil;

Q^.Element := El; Right:=Q

End;

Б. Выбор элемента из очереди

Пусть в программе имеется описание типа, приведенное в примере 7.7.

Алгоритм выбора элемента из очереди:

Чтение значения из начала очереди.

Запоминание ссылки на начало очереди.

Исключение первого звена из начала очереди.

Уничтожение первого звена.

Пример 7.17.

Процедура выбора элемента из очереди. Параметр Left используется для передачи адреса начала очереди. В параметр Elem передается значение из начала очереди.

Procedure Udal (Var Left: Adres1; Var Elem: <Тип_элементов_очереди>);

Var Q:Adres1; Begin

Elem := Left^.Element;

{10} Q := Left;

{11} Left := Left^.Adrcled; Dispose(Q)

End;

В. Организация очереди

Пусть в программе имеется описание типа, приведенное в примере 7.7.

Организация очереди основана на использовании операции занесения элемента в очередь

Пример 7.18.

Организация очереди. Ввод исходного текста в очередь. Признак окончания текста – точка. Используется процедура Dobavl занесения элемента в очередь (см. пример 7.16).

...

Var

Right, Left: Adres1; Bykva: Char;

Begin

Read (Bykva);

New (Left);

Left^.Adrcled := Nil; Left^.Element := Bykva;

Right := Left;

Read (Bykva);

While Bykva <>’. Do Begin

Dobavl (Right, Bykva);

Read (Bykva)

End

End.