Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1337.docx
Скачиваний:
3
Добавлен:
01.04.2025
Размер:
211.4 Кб
Скачать

57. Стек, очередь, дек

Стеком (англ. stack) называется хранилище данных, в котором можно работать только с одним элементом: тем, который был добавлен в стек последним. Говорят, что стек реализует дисциплину обслуживания LIFO (Last In – First Out, последним пришел – первым ушел). Физически стек может быть реализован на основе массива или на основе односвязанного линейного списка, в котором все операции осуществляются только с началом списка.

Стек должен поддерживать следующие операции:
push – добавить (положить) в конец стека новый элемент; pop – извлечь из стека последний элемент;

190

isEmpty – проверка, пуст ли стек;
top – узнать значение последнего элемента (не удаляя его); size – узнать количество элементов в стеке;
clear – очистить стек (удалить из него все элементы).

Последний элемент в стеке называется верхушкой стека.

На языке Паскаль стек можно описать с помощью следующих структур:

Type
Point=^elsteka; // указатель на элемент стека Elsteka=record // элемент стека это:

Info:char; // информационная часть – любой тип паскаля, в т.ч. записи

Pred:point; //указатель на предыдущий (более нижний) элемент стека. End;

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

Обратная польская запись (ОПЗ) – это способ записи выражений (как правило алгебраических) в так называемом постфиксном виде, т.е. в таком виде, когда сначала записываются все операнды, а потом выполняемые над ними операции. ОПЗ как правило используется в трансляторах и компиляторах для преобразования выражений в машинный код и их вычисления, а также для анализа и трансляции синтаксических конструкций языка к виду, удобному для генерации машинного кода. Особенность выражения (в более общем виде программы), написанного в ОПЗ, заключается в том, что вычислить это выражение (перевести программу в машинный код) можно одним проходом слева направо фактически символ за символом, операция за операцией, получая значение выражения.
Пример:
(a+b)*(c/a*c- c*d)
Представим это выражение в постфиксном виде:
ab+cac*ed*-/+

NULL

191

Очередью (aнгл. queue)) называется структура данных, в которой элементы кладутся в конец, а извлекаются из начала. Таким образом, первым из очереди будет извлечен тот элемент, который будет добавлен раньше других. Говорят, что очередь реализует дисциплину обслуживания FIFO (First in -- first out, первым пришел -- первым ушел).

Очередь можно рассматривать как однонаправленный список, в котором можем удалять только из начала, а добавлять только в конец:

Деком (англ. deque – аббревиатура от double-ended queue, двухсторонняя очередь) называется структура данных, в которую можно удалять и добавлять элементы как в начало, так и в конец. Дек хранится в памяти так же, как и очередь.

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

Система команд дека:

push_front

Добавить (положить) в начало дека новый элемент

push_back

Добавить (положить) в конец дека новый элемент

pop_front

Извлечь из дека первый элемент

pop_back

Извлечь из дека последний элемент

front

back

size

clear