448
ГЛАВА 8. ПОДПРОГРАММЫ
Прежде,чем приступить к реализации подпрограмм необходимо договорить-
ся о том, для хранения каких элементов будет использоваться библиотека.
Ограничиваясь иллюстративными целями, будем считать, что очередь пред-
назначена для хранения целочисленных значений, а значение
NotEl
равно ну-
лю.
Существует довольно много вариантов реализации очередей, приспосо-
бленных для использования в различных режимах. Среди режимов, опреде-
ляющих выбор конкретного решения, можно указать, с одной стороны, на
дисциплину доступа к данным, когда чередование записи и чтения информа-
ции более или менее равномерно, а с другой — на работу большими порци-
ями, при которой чередуются периоды с относительным преобладанием за-
писи с периодами относительно более частого чтения. В первом случае при
достаточно большом объеме памяти, отводимой для хранения элементов, си-
туации с переполнением очереди являются исключительными, во втором —
необходима особая забота об обработке переполнений. На выбор варианта
реализации очереди влияет и то, предусматривается или нет режим работы
с приоритетами: требуется ли обеспечить возможность пропускания элемен-
та “вперед”. Список подобных особенностей использования очередей легко
продолжить. Зачастую трудно заранее предвидеть поведение вычислитель-
ного процесса, а значит и оптимальную реализацию очереди. Именно поэто-
му весьма желательно явно разделять уровни использования и реализации:
если реализация окажется неудачной, смена ее не повлечет изменение ис-
пользующей программы.
В приводимой программе используется следующий подход к реализации
очередей. Хранилище элементов представляется массивом
Container
объема
MaxSize
. Для указания компоненты массива, в которой при очередном обра-
щении к процедуре
PutElQueue
разместится элемент очереди, используется
переменнаяиндекс
IB
.Элемент,который должен быть извлечен из
Container
’а
при обращении к функции
GetElQueue
, указывается переменной-индексом
IE
. Три структуры данных:
Container
,
IB
и
IE
являются основой реализацион-
ного представления очереди.
Все хранимые элементы очереди размещаются между компонентами, ин-
дексируемыми
IB
и
IE
(см. рис. 8.9a). Запись элемента влечет увеличение ин-
декса
IB
, а чтение —
IE
. Если после чтения элемента
IE
оказывается равным
IB
, то это означает, что все элементы очереди прочитаны (состояние очере-
ди —
Empty
). Когда в результате записи элемента значения индекса
IB
дости-
гает своего максимума (
MaxSize
), то за счет произошедших ранее чтений из
очереди в массиве
Container
может оказаться свободное место в его начале,