Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

К9-12В. Вопросы и ответы к ГОСам 2013 / Программирование на языке высокого уровня / 02. Стек и очередь - определение, основные операции. Особенности выполнения операций при реализации стека и очереди вект

.docx
Скачиваний:
96
Добавлен:
10.05.2014
Размер:
90.55 Кб
Скачать

2. Стек и очередь - определение, основные операции. Особенности выполнения операций при реализации стека и очереди вектором.

Очереди и стеки

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

Очередь представляет собой упорядоченное по времени поступления множество элементов, характеризующееся двумя концами: началом и концом очереди (рис. II-2).

С очередью можно выполнять следующие операции:

  1. Добавление нового элемента; в этом случае элемент ставится в конец упорядоченного множества.

  2. Исключение элемента из очереди; исключение элемента можно производить только с начала упорядоченного множества, определяющего очередь.

Элемент, поступивший в очередь первым, является единственным доступным элементом, и он должен быть исключен первым.

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

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

Структуры данных очередь и стек могут иметь переменную длину. Кроме того, сами элементы очереди или стека также могут быть переменной длины; в этом случае внутри элемента должна содержаться информацию о его длине.

Как было сказано ранее, стек характеризуется одним концом – вершиной стека. Операции занесения информации в стек и выборки из стека выполняются всегда через вершину стека. При чтении информации из стека необходимо проверять ситуацию "стек пуст"; данная ситуация представляет собой специальный случай штатной ситуации, требующий, возможно, особой обработки в программе, работающей со стеком. При записи информации, учитывая, что данные размещаются в некотором ограниченном пространстве, следует проверять ситуацию "стек полон", при которой запись в стек невозможна. Данная ситуация является нештатной и свидетельствует, как правило, о недостаточной проработке прикладной программы (или наличии ошибки в программе). Возникновение такой ситуации в программе требует анализа правильности ее функционирования и принятия необходимых мер.

Стек-вектор

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

В исходном состоянии, когда стек пуст, вершина стека (индекс элемента вектора SP = 0) определяет первый элемент. При записи в стек индекс увеличивается на 1, при чтении из стека – уменьшается на 1 (рис. II-22). Ситуация "стек полон" диагностируется, когда индекс выходит за пределы вектора (SP = n).

Динамическую структуру данных очередь также можно отображать и вектором, и списком.

Как было сказано ранее, очередь характеризуется двумя концами – началом и концом очереди. Запись информации выполняется в конец очереди, чтение – из начала очереди. При чтении информации из очереди также необходимо проверять ситуацию "очередь пуста" (опять же, данная ситуация является штатной). При записи информации следует проверять ситуацию "очередь полна", при которой запись в очередь невозможна. Данная ситуация требует особой обработки, зависящей от назначения прикладной программы.

Очередь-вектор

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

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

При записи в очередь информация записывается в доступный элемент очереди; значение индекса конца очереди увеличивается и определяет следующий доступный для записи элемент. Значение индекса начала очереди не изменяется и определяет первый доступный для чтения элемент – первый элемент вектора.

При чтении из очереди передается информация из элемента, определяемого индексом начала очереди. При этом значение индекса увеличивается и определяет следующий доступный для чтения элемент. Недопустимо при выполнении операции чтения из очереди перемещать саму информацию в очереди так, чтобы очередной доступный для чтения элемент очереди находился всегда в первом элементе вектора (рис. II-24).

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

При выполнении подряд нескольких операций записи в очередь может возникнуть ситуация "очередь полна". При этом значения индексов начала и конца очереди совпадают – оба индекса определяют один и тот же элемент очереди (рис. II-26).

Если теперь выполнять подряд операции чтения из очереди, в какой-то момент возникнет ситуация "очередь пуста", при которой значения индексов опять же совпадают (рис. II-26). Следовательно, для того, чтобы различить эти две ситуации, требуются дополнительные данные. Удобно использовать для очереди дополнительно счетчик числа элементов (запросов), записанных (поставленных) в очередь. Этот счетчик можно будет использовать и в других целях – например, для определения общего количества запросов или для вывода всех запросов, поставленных в очередь.

Таким образом, можно определить следующие операции с очередью.

Пусть Type определяет тип элемента, записываемого в очередь, QSIZE – максимальнуюдлину очереди.

Type Que[QSIZE]; /*очередь */

int j = 0, /* индекс начала очереди */

k = 0, /* индекс конца очереди */

cnt = 0; /* количество запросов, поставленных в очередь */

/* Запись в очередь */

int putQ(Type el)

{

if(j == k &&cnt)

return -1; /* очередь полна */

Que[k] = el;

k = (k + 1) % QSIZE;

cnt ++;

return 0;

}

/* Чтение из очереди */

int getQ(Type *el)

{

if(!cnt)

return -1; /* очередь пуста */

*el = Que[j];

j = (j + 1) % QSIZE;

cnt --;

return 0;

}

Соседние файлы в папке Программирование на языке высокого уровня