- •Вопросы для подготовки к экзамену по курсу «Программирование на языке высокого уровня (структурное программирование)»
- •Стек-вектор
- •Стек-список
- •Очередь-вектор
- •Очередь-список
- •Статическая просматриваемая таблица-вектор
- •Динамическая просматриваемая таблица-вектор
- •Просматриваемая таблица-список
- •Упорядоченная таблица-вектор
- •Динамическая упорядоченная таблица – вектор
- •Упорядоченная таблица – двоичное дерево
- •Перемешивание сцеплением
- •Открытое перемешивание
- •Упорядоченная таблица – двоичное дерево
Стек-вектор
При отображении стека вектором вершина стека связывается с базовым адресом вектора и задается индексом первого элемента вектора. Вершина стека может определять (по усмотрению разработчика) или свободный элемент, в который производится запись, или занятый элемент, из которого производится чтение. В приведенных ниже примерах вершина стека определяет элемент стека, доступный для записи.
В исходном состоянии, когда стек пуст, вершина стека (индекс элемента вектора SP = 0) определяет первый элемент. При записи в стек индекс увеличивается на 1, при чтении из стека – уменьшается на 1 (рис. II–23). Ситуация "стек полон" диагностируется, когда индекс выходит за пределы вектора (SP = n).
Рис. II–2
Стек-список
При отображении стека списком используется линейный односвязный список. Вершина стека связывается с началом списка и задается указателем на первый элемент списка. Может использоваться (по усмотрению разработчика) обычный список или список с головным элементом. В приведенных ниже примерах используется обычный список.
В исходном состоянии, когда стек пуст, вершина стека (указатель на начало списка) имеет пустое значение: SP = NULL (рис. II–24). При записи информации в стек создается новый элемент списка, в который заносится информация, и созданный элемент включается в начало списка. Ситуация "стек полон" диагностируется, когда попытка создания нового элемента списка завершается неудачей (функция выделения памяти malloc()или оператор языка С++ выделения памяти new возвращают значение NULL, что свидетельствует об ошибке).
При чтении из стека первый элемент списка исключается из списка. Информация из элемента списка передается как результат операции чтения, а сам элемент списка уничтожается (т.е. память, заданная элементом списка, освобождается).
Элементарная структура данных – очередь: определение, основные операции. Реализация очереди вектором. Возникающие проблемы.
Очередь представляет собой упорядоченное по времени поступления множество элементов, характеризующееся двумя концами: началом и концом очереди (рис. II–2).
Рис. II–3
С очередью можно выполнять следующие операции:
Добавление нового элемента; в этом случае элемент ставится в конец упорядоченного множества.
Исключение элемента из очереди; исключение элемента можно производить только с начала упорядоченного множества, определяющего очередь.
Элемент, поступивший в очередь первым, является единственным доступным элементом, и он должен быть исключен первым.
Вектор см. билет 3.
Очередь-вектор
Очередь-вектор задается двумя индексами, определяющими начало и конец очереди, и своей максимальной длиной. Начало очереди обычно определяет элемент очереди, доступный для чтения, а конец очереди – свободный элемент, в который производится запись.
В исходном состоянии очередь пуста; индекс конца очереди определяет первый доступный для записи элемент очереди – т.е. первый элемент вектора. Значение индекса начала очереди совпадает со значением индекса конца очереди.
При записи в очередь информация записывается в доступный элемент очереди; значение индекса конца очереди увеличивается и определяет следующий доступный для записи элемент. Значение индекса начала очереди не изменяется и определяет первый доступный для чтения элемент – т.е. первый элемент вектора.
При чтении из очереди передается информация из элемента, определяемого индексом начала очереди. При этом значение индекса увеличивается и определяет следующий доступный для чтения элемент. Недопустимо при выполнении операции чтения из очереди перемещать саму информацию в очереди так, чтобы очередной доступный для чтения элемент очереди находился всегда в первом элементе вектора (рис. II–25).
Рис. II–4
Так как при выполнении операций с очередью изменяются (увеличиваются) значения индексов начала и конца очереди, очередь-вектор должна быть организована циклически: за последним элементом вектора (с максимальным значением индекса) должен следовать его первый элемент (рис. II–26).
Рис. II–5
При выполнении подряд нескольких операций записи в очередь может возникнуть ситуация "очередь полна". При этом значения индексов начала и конца очереди совпадают – оба индекса определяют один и тот же элемент очереди (рис. II–27).
Если теперь выполнять подряд операции чтения из очереди, в какой-то момент возникнет ситуация "очередь пуста", при которой значения индексов опять же совпадают (рис. II–27). Следовательно, для того, чтобы различить эти две ситуации, требуются дополнительные данные. Удобно использовать для очереди дополнительно счетчик числа элементов (запросов), записанных (поставленных) в очередь. Этот счетчик можно будет использовать и в других целях – например, для определения общего количества запросов или для вывода всех запросов, поставленных в очередь.
Рис. II–6
Таким образом, можно определить следующие операции с очередью.
Пусть 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;
}
Элементарная структура данных – очередь: определение, основные операции. Реализация очереди списком (линейным и циклическим). Возникающие проблемы.
Очередь см. билет 6.
Список см. билет 4.
