Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Динамические структуры данных: очереди






 

Очередь — это информационная структура, в которой для добавления элементов доступен только один конец, называемый хвостом, а для удаления — другой, называемый головой. В англоязычной литературе для обозначения очередей довольно часто используется аббревиатура 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 < iostream.h>

#include < conio.h>

#include < stdlib.h>

#include < time.h>

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. Тогда он делится нацело на одно из чисел 2, 3, 5. x находится в одной из очередей и, следовательно, является в ней первым (меньшие напечатаны, а элементы очередей не напечатаны). Напечатав x, нужно его изъять и добавить его кратные. Длины очередей не превосходят числа напечатанных элементов.

{Язык Pascal}

Program Example;

Uses Spisok2;

Var X2, X3, X5: U; X: BT; I, N: Word;

Procedure PrintAndAdd(T: BT);

Begin

If T < > 1 Then Write(T: 6);

V_Och(X2, T * 2); V_Och(X3, T * 3); V_Och(X5, T * 5);

End;

Function Min(A, B, C: BT): BT;

Var Vsp: BT;

Begin

If A < B Then Vsp: = A Else Vsp: = B;

If C < Vsp Then Vsp: = C;

Min: = Vsp

End;

Begin

X2: = Nil; X3: = Nil; X5: = Nil;

Write('Сколько чисел напечатать? '); ReadLn(N);

PrintAndAdd(1);

For I: = 1 To N Do

Begin

X: = Min(X2^.Inf, X3^.Inf, X5^.Inf);

PrintAndAdd(X);

If X = X2^.Inf Then Iz_Och(X2, X);

If X = X3^.Inf Then Iz_Och(X3, X);

If X = X5^.Inf Then Iz_Och(X5, X);

End;

Ochistka(X2); Ochistka(X3); Ochistka(X5);

WriteLn

End.

// Язык С++

#include " spis2.cpp"

void PrintAndAdd(BT T);

BT Min (BT A, BT B, BT C);

U * X2, *X3, *X5;

void main ()

{ BT X; long I, N;

X2 = NULL; X3 = NULL; X5 = NULL;

cout < < " Сколько чисел напечатать? "; cin > > N;

PrintAndAdd(1);

for (I=1; I< =N; I++)

{ X = Min(X2-> Inf, X3-> Inf, X5-> Inf);

PrintAndAdd(X);

if (X==X2-> Inf) X2=Iz_Och(X2, X);

if (X==X3-> Inf) X3=Iz_Och(X3, X);

if (X==X5-> Inf) X5=Iz_Och(X5, X);

}

X2=Ochistka(X2); X3=Ochistka(X3); X5=Ochistka(X5); cout < < endl;

}

void PrintAndAdd(BT T)

{ if (T! =1) {cout.width(6); cout < < T; }

X2=V_Och(X2, T*2);

X3=V_Och(X3, T*3);

X5=V_Och(X5, T*5);

}

BT Min (BT A, BT B, BT C)

{ BT vsp;

if (A < B) vsp=A; else vsp=B;

if (C < vsp) vsp=C;

return vsp;

}

 

Контрольные вопросы и задания

1. Какую структуру данных называют очередью? Что такое хвост и голова очереди?

2. На базе каких структур данных может быть организована очередь?

3. Приведите из жизни примеры организации чего-либо по принципу очереди.

4. Используя очередь, напечатайте сначала русские символы данной строки, а затем все остальные, сохранив их порядок следования.

5. Составьте и решите задачу с использованием абстрактного типа данных " очередь".






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.