КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Динамическая реализация очереди
Очереди При динамической реализацииосновой очереди является линейный односвязный список. Однако, в отличие от динамического стека, который определяется одним указателем (на вершину), для работы с очередью необходимы два указателя: на голову очереди и на ее хвост. Поэтому для определения очереди возьмем запись (record), содержащую в качестве полей два этих указателя. И тогда при работе с очередью она будет характеризоваться только одним параметром. Это описание очереди и основные операции приведены в листинге 9.16. Листинг 9.16. Очередь, реализованная динамически type TInfo = Integer; PNode = ^TNode; TNode = record Info: TInfo; Next: PNode end; TQueue = record Head, // голова очереди Tail: PNode // хвост очереди end; TFile = text;
procedure InitQueue(var q: TQueue); // инициализация очереди begin q.Head:= Nil; end;
function QueueIsEmpty(q: TQueue): Boolean; // проверка на пустоту begin Result:= q.Head = Nil; end;
procedure InQueue(var q: TQueue; x: TInfo); var p: PNode; begin new(p); with p^ do begin Info:= x; Next:= Nil end; if QueueIsEmpty(q) then // если очередь пуста with q do begin // создаем первый элемент очереди Head:= p; Tail:= p end else // добавляем элемент в конец очереди with q do begin Tail.Next:= p; Tail:= p end; end;
function OutQueue(var q: TQueue): TInfo; // взять из очереди var p: PNode; begin with q do begin Result:= Head^.Info; p:= Head; Head:= Head^.Next; dispose(p) end; end; Замечание Функция OutQueue() — взятие элемента из очереди — вызывается только в том случае, когда очередь не пустая. Обработка пустой очереди производится в вызывающем контексте. В качестве примера использования очереди рассмотрим следующую задачу. Завод скоропортящейся продукции, например, глазированных сырков, имеет склад, куда поступает готовая продукция: коробки с сырками. В магазин по заявке следует отправить первой ту коробку, которая раньше всех поступила на склад. Но, если заявок поступило много, и склад опустел, то вывозить сырки можно сразу из цеха, минуя склад. Незаявленная продукция остается на складе. В отчете требуется представить характеристики коробок, отправленных на продажу. Рассмотрим модель этой задачи: дан файл целых чисел, положительные (коробки с сырками) и отрицательные (заявки из магазинов) распределены произвольно, однако известно, что отрицательных чисел меньше, чем положительных. Требуется напечатать в порядке следования столько положительных чисел из файла, сколько в нем отрицательных чисел. Для решения этой задачи необходимо иметь очередь для положительных чисел и счетчик для отрицательных. В очередь будем помещать положительные числа, пока не встретится отрицательного числа. Если поступило отрицательное число, а очередь пуста, то увеличиваем счетчик. Если пришло положительное число и счетчик не равен нулю, то печатаем положительное число сразу, не помещая его в очередь. Блок-схема алгоритма обработки числа, поступившего из файла, приведена на рис. 9.13. Рис. 9.13. Блок-схема алгоритма обработки числа, поступившего из файла Полностью алгоритм обработки чисел, поступающих из файла, с использованием очереди, реализован в виде процедуры PositivePrint() и приведен в листинге 9.17. Листинг 9.17. Использование очереди при обработке чисел, поступающих из файла type Tfile: file of Integer;
procedure PositivePrint(var f: TFile); var q: TQueue; i, // число из файла iq: TInfo; // число из очереди cnt: Integer; begin InitQueue(q); // инициализация очереди cnt:= 0; // инициализация счетчика reset(f); while not eof(f) do begin // пока не конец файла read(f, i); if i < 0 then begin // число отрицательное (заявка) if QueueIsEmpty(q) then cnt:= cnt + 1 else write(OutQueue(q)) end else // число положительное (коробка с продукцией) if cnt = 0 then InQueue(q, i) else begin write(i); cnt:= cnt - 1; end; end; end;
Дата добавления: 2014-01-20; Просмотров: 804; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |