Часть полного текста документа:Динамические структуры данных: очереди Очередь - это информационная структура, в которой для добавления элементов доступен только один конец, называемый хвостом, а для удаления - другой, называемый головой. В англоязычной литературе для обозначения очередей довольно часто используется аббревиатура FIFO (first-in-first-out - первый вошёл - первым вышел). Очередь разумнее всего моделировать, отобразив её на двунаправленный кольцевой список. В этом случае в заглавном звене будет присутствовать информация как об указателе на голову, так и на хвост очереди. Выделим типовые операции над очередями: добавление элемента в очередь (помещение в хвост); удаление элемента из очереди (удаление из головы); проверка, пуста ли очередь; очистка очереди. Вот модуль, содержание которого составляют реализованные типовые операции над очередями. {Язык Pascal} Unit Spisok2; Interface Type BT = LongInt; U = ^Zveno; Zveno = Record Inf : BT; N, P: U End; Procedure V_Och(Var First : U; X : BT); Procedure Iz_Och(Var First : U; Var X : BT); Procedure Ochistka(Var First: U); Function Pust(First : U) : Boolean; Implementation Procedure V_Och; Var Vsp : U; Begin New(Vsp); Vsp^.Inf := X; If First = Nil then begin Vsp^.N := Vsp; Vsp^.P := Vsp; First := Vsp end else begin Vsp^.N := First; Vsp^.P := First^.P; First^.P^.N := Vsp; First^.P := Vsp; end; End; Procedure Iz_Och; Var Vsp : U; Begin x:=first^.inf; if First^.p=first then begin dispose(first); first:= nil end else begin Vsp := First; First := First^.N; First^.P := Vsp^.P; Dispose(Vsp) end End; Procedure Ochistka; Var Vsp : BT; Begin While Not Pust(First) Do Iz_Och(First, Vsp) End; Function Pust; Begin Pust := First = Nil End; Begin End. // Язык С++ #include #include #include #include typedef long BT; struct U{ BT Inf; U *N, *P;}; U *V_Och(U *First, BT X) { U *Vsp; Vsp = (U*) malloc (sizeof(U)); Vsp->Inf=X; if (!First) {Vsp->N=Vsp; Vsp->P=Vsp; First=Vsp;} else {Vsp->N=First; Vsp->P=First->P; First->P->N=Vsp; First->P=Vsp;} return First;} U *Iz_Och(U *First, BT &X) { U *Vsp; X=First->Inf; if (First->P==First) {free(First); First=NULL;} else {Vsp=First; First=First->N; First->P=Vsp->P; free(Vsp);} return First;} int Pust(U *First) { return !First;} U *Ochistka(U *First) { BT Vsp; while (!Pust(First)) First=Iz_Och(First, Vsp); return First; } Пример. Напечатать в порядке возрастания первые n натуральных чисел, в разложение которых на простые множители входят только числа 2, 3, 5. Алгоритм решения. Введем три очереди x2, x3, x5, в которых будем хранить элементы, которые соответственно в 2, 3, 5 раз больше напечатанных, но еще не напечатаны. Рассмотрим наименьший из ненапечатанных элементов; пусть это x. ............ |