
К9-12В. Вопросы и ответы к ГОСам 2013 / Программирование на языке высокого уровня / 03. Стек и очередь - определение, основные операции. Особенности выполнения операций при реализации стека и очереди спис
.docx03. Стек и очередь - определение, основные операции. Особенности выполнения операций при реализации стека и очереди списком
Очереди и стеки
Очереди и стеки – это динамически изменяющиеся структуры данных. В каждый момент времени очередь или стек содержат некоторое упорядоченное множество элементов, но в разные моменты времени эти множества могут быть различными.
Очередь представляет собой упорядоченное по времени поступления множество элементов, характеризующееся двумя концами: началом и концом очереди (рис. II-2).
С очередью можно выполнять следующие операции:
-
Добавление нового элемента; в этом случае элемент ставится в конец упорядоченного множества.
-
Исключение элемента из очереди; исключение элемента можно производить только с начала упорядоченного множества, определяющего очередь.
Элемент, поступивший в очередь первым, является единственным доступным элементом, и он должен быть исключен первым.
Стек представляет собой также упорядоченное по времени поступления множество элементов, но в отличие от очереди стек характеризуется только одним концом – вершиной стека (рис. II-3).
Для стека определены те же операции, что и для очереди, однако и добавление элемента в стек, и исключение элемента из стека можно производить только с одного конца множества - вершины стека. При этом единственным доступным элементом является элемент, добавленный в стек последним, и этот элемент должен быть исключен первым.
Структуры данных очередь и стек могут иметь переменную длину. Кроме того, сами элементы очереди или стека также могут быть переменной длины; в этом случае внутри элемента должна содержаться информацию о его длине.
Как было сказано ранее, стек характеризуется одним концом – вершиной стека. Операции занесения информации в стек и выборки из стека выполняются всегда через вершину стека. При чтении информации из стека необходимо проверять ситуацию "стек пуст"; данная ситуация представляет собой специальный случай штатной ситуации, требующий, возможно, особой обработки в программе, работающей со стеком. При записи информации, учитывая, что данные размещаются в некотором ограниченном пространстве, следует проверять ситуацию "стек полон", при которой запись в стек невозможна. Данная ситуация является нештатной и свидетельствует, как правило, о недостаточной проработке прикладной программы (или наличии ошибки в программе). Возникновение такой ситуации в программе требует анализа правильности ее функционирования и принятия необходимых мер.
Стек-список
При отображении стека списком используется линейный односвязный список. Вершина стека связывается с началом списка и задается указателем на первый элемент списка. Может использоваться (по усмотрению разработчика) обычный список или список с головным элементом. В приведенных ниже примерах используется обычный список.
В исходном состоянии, когда стек пуст, вершина стека (указатель на начало списка) имеет пустое значение: SP = NULL (рис. II-23). При записи информации в стек создается новый элемент списка, в который заносится информация, и созданный элемент включается в начало списка. Ситуация "стек полон" диагностируется, когда попытка создания нового элемента списка завершается неудачей (оператор выделения памяти new возвращает значение NULL, что свидетельствует об ошибке).
При чтении из стека первый элемент списка исключается из списка. Информация из элемента списка передается как результат операции чтения, а сам элемент списка уничтожается (память, заданная элементом списка, освобождается).
Динамическую структуру данных очередь также можно отображать и вектором, и списком.
Как было сказано ранее, очередь характеризуется двумя концами – началом и концом очереди. Запись информации выполняется в конец очереди, чтение – из начала очереди. При чтении информации из очереди также необходимо проверять ситуацию "очередь пуста" (опять же, данная ситуация является штатной). При записи информации следует проверять ситуацию "очередь полна", при которой запись в очередь невозможна. Данная ситуация требует особой обработки, зависящей от назначения прикладной программы.
Очередь-список
При отображении очереди списком можно использовать и линейный, и циклический односвязные списки.
Очередь, отображаемая линейным односвязным списком, задается двумя указателями: на начало очереди (первый элемент списка) и конец очереди (последний элемент списка). В исходном состоянии очередь пуста и оба указателя имеют пустые (NULL) значения.
При записи в очередь первого элемента изменяются оба указателя, так как первый элемент в данной ситуации становится и последним элементом очереди. Последующие операции записи приводят к изменению только указателя на конец очереди (рис. II-27).
При чтении из очереди изменяется указатель на начало очереди. Когда будет прочитан последний элемент, очередь будет пустой и оба указателя (на начало и на конец очереди) должны иметь пустое значение (рис. II-28).
При отображении очереди циклическим односвязным списком достаточно иметь один указатель – на последний элемент очереди (last). Первый элемент очереди (циклического списка) будет определяться ее последним элементом; это означает, что указателем на начало очереди будет являться поле next последнего элемента списка, т.е., last->next.
В исходном состоянии очередь пуста и указатель на конец очереди имеет пустое значение.
При записи в очередь нового элемента будет изменяться указатель на конец очереди – он будет указывать на записываемый элемент. Так как последний элемент очереди служит указателем на начало очереди, в поле next записываемого элемента должно быть записано значение указателя на начало очереди. При записи элемента в пустую очередь записываемый элемент является и первым, и последним, поэтому данный элемент будет указывать на себя (рис. II-29).
При чтении элемента из очереди удаляется первый элемент, поэтому в последнем элементе очереди, на который указывает last, будет меняться значение поля указателя. Когда из очереди будет прочитан последний элемент (перед выполнением операции чтения в очереди находится только один элемент, который является и первым, и последним), указатель на конец очереди должен получить пустое значение (рис. II-30).