Динамічні структури даних: черги h2>
Черга
- Це інформаційна структура, в якій для додавання елементів доступний
тільки один кінець, званий хвостом, а для видалення - другий, званий
головою. В англомовній літературі для позначення черг досить часто
використовується абревіатура FIFO (first-in-first-out - перший увійшов - перший
вийшов). p>
Черга
найрозумніше моделювати, відобразивши її на двонаправлений кільцевої список.
У цьому випадку в заголовному ланці буде присутня інформація як про
покажчику на голову, так і на хвіст черги. p>
Виділимо
типові операції над чергами: p>
додавання
елемента в чергу (приміщення у хвіст); p>
видалення
елемента з черги (видалення з голови); p>
перевірка,
пуста чи чергу; p>
очищення
черги. p>
Ось
модуль, зміст якого становлять реалізовані типові операції над
чергами. p>
(Мова Pascal) p>
Unit Spisok2; p>
Interface p>
Type BT = LongInt; p>
U = ^ Zveno; p>
Zveno = Record Inf: BT; N, P: U
End; p>
Procedure V_Och (Var First: U; X: BT); p>
Procedure Iz_Och (Var First: U; Var X: BT); p>
Procedure Ochistka (Var First: U); p>
Function Pust (First: U):
Boolean; p>
Implementation p>
Procedure V_Och; p>
Var Vsp: U; p>
Begin p>
New (Vsp); p>
Vsp ^. Inf: = X; p>
If First = Nil then begin Vsp ^. N
: = Vsp; Vsp ^. P: = Vsp; First: = Vsp end p>
else begin Vsp ^. N
: = First; Vsp ^. P: = First ^. P; First ^. P ^. N: = Vsp; First ^. P: = Vsp; end; p>
End; p>
Procedure Iz_Och; p>
Var Vsp: U; p>
Begin p>
x: = first ^. inf; p>
if First ^. p = first p>
then begin p>
dispose (first); p>
first: = nil p>
end p>
else p>
begin p>
Vsp: = First; p>
First: = First ^. N; p>
First ^. P: = Vsp ^. P; p>
Dispose (Vsp) p>
end p>
End; p>
Procedure Ochistka; p>
Var Vsp: BT; p>
Begin p>
While Not Pust (First) Do
Iz_Och (First, Vsp) p>
End; p>
Function Pust; p>
Begin p>
Pust: = First = Nil p>
End; p>
Begin p>
End. p>
// Мова С + + p>
# include p>
# include p>
# include p>
# include p>
typedef long BT; p>
struct U ( p>
BT Inf; p>
U * N, * P ;}; p>
U * V_Och (U * First, BT X) p>
(U * Vsp; p>
Vsp = (U *) malloc (sizeof (U)); p>
Vsp-> Inf = X; p>
if (! First) (Vsp-> N = Vsp; Vsp-> P = Vsp;
First = Vsp;) p>
else (Vsp-> N = First; Vsp-> P = First-> P;
First-> P-> N = Vsp; First-> P = Vsp;) p>
return First;) p>
U * Iz_Och (U * First, BT & X) p>
(U * Vsp; p>
X = First-> Inf; p>
if (First-> P == First) (free (First);
First = NULL;) p>
else (Vsp = First; First = First-> N;
First-> P = Vsp-> P; free (Vsp);) p>
return First;) p>
int Pust (U * First) p>
(
return! First;) p>
U * Ochistka (U * First) p>
(BT Vsp; p>
while (! Pust (First)) First = Iz_Och (First, Vsp);
p>
return First; p>
) p>
Приклад.
Надрукувати в порядку зростання першого n натуральних чисел, в розкладання
яких на прості множники входять тільки числа 2, 3, 5. p>
Алгоритм
рішення. Введемо три черги x2, x3, x5, в яких будемо зберігати елементи,
які відповідно в 2, 3, 5 разів більше надрукованих, але ще не надруковані.
Розглянемо найменший з недруковані елементів, і нехай це x. Тоді він
ділиться без остачі на одне з чисел 2, 3, 5. x знаходиться в одній з черг і,
отже, є в ній перший (менші надруковані, а елементи черг
не надрукована). Надрукувавши x, потрібно його вилучити і додати його кратні. Довжини
черг не перевершують числа надрукованих елементів. p>
(Мова Pascal) p>
Program Example; p>
Uses Spisok2; p>
Var X2, X3, X5: U; X: BT; I, N:
Word; p>
Procedure PrintAndAdd (T: BT); p>
Begin p>
If T 1 Then Write (T: 6); p>
V_Och (X2, T * 2); V_Och (X3, T * 3); V_Och (X5, T * 5); p>
End; p>
Function Min (A, B, C: BT): BT; p>
Var Vsp: BT; p>
Begin p>
If A
If C
Min: = Vsp p>
End; p>
Begin p>
X2: = Nil; X3: = Nil; X5: = Nil; p>
Write ( 'Скільки чисел надрукувати?'); ReadLn (N); p>
PrintAndAdd (1); p>
For I: = 1 To N Do p>
Begin p>
X: = Min (X2 ^. Inf, X3 ^. Inf, X5 ^. Inf);
p>
PrintAndAdd (X); p>
If X = X2 ^. Inf Then Iz_Och (X2, X); p>
If X = X3 ^. Inf Then Iz_Och (X3, X); p>
If X = X5 ^. Inf Then Iz_Och (X5, X); p>
End; p>
Ochistka (X2); Ochistka (X3); Ochistka (X5); p>
WriteLn p>
End. p>
// Мова С + + p>
# include "spis2.cpp" p>
void PrintAndAdd (BT T); p>
BT Min (BT A, BT B, BT C); p>
U * X2, * X3, * X5; p>
void main () p>
(BT X; long I, N; p>
X2 = NULL; X3 = NULL; X5 = NULL; p>
cout
> N; p>
PrintAndAdd (1); p>
for (I = 1; IInf, X3-> Inf,
X5-> Inf); p>
PrintAndAdd (X); p>
if (X == X2-> Inf) X2 = Iz_Och (X2, X); p>
if (X == X3-> Inf) X3 = Iz_Och (X3, X); p>
if (X == X5-> Inf) X5 = Iz_Och (X5, X); p>
) p>
X2 = Ochistka (X2); X3 = Ochistka (X3); X5 = Ochistka (X5); cout