• Новости
  • Темы
    • Экономика
    • Здоровье
    • Авто
    • Наука и техника
    • Недвижимость
    • Туризм
    • Спорт
    • Кино
    • Музыка
    • Стиль
  • Спецпроекты
  • Телевидение
  • Знания
    • Энциклопедия
    • Библия
    • Коран
    • История
    • Книги
    • Наука
    • Детям
    • КМ школа
    • Школьный клуб
    • Рефераты
    • Праздники
    • Гороскопы
    • Рецепты
  • Сервисы
    • Погода
    • Курсы валют
    • ТВ-программа
    • Перевод единиц
    • Таблица Менделеева
    • Разница во времени
Ограничение по возрасту 12
KM.RU
Рефераты
Главная → Рефераты → Информатика, программирование
  • Новости
  • В России
  • В мире
  • Экономика
  • Наука и техника
  • Недвижимость
  • Авто
  • Туризм
  • Здоровье
  • Спорт
  • Музыка
  • Кино
  • Стиль
  • Телевидение
  • Спецпроекты
  • Книги
  • Telegram-канал

Поиск по рефератам и авторским статьям

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

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

}

Список литературы

Для подготовки данной работы были использованы материалы с сайта http://comp-science.narod.ru

Дата добавления: 18.07.2005

База рефератов на портале KM.RU существует с 1999 года. Она пополнялась не только готовыми рефератами, докладами, курсовыми, но и авторскими публикациями, чтобы учащиеся могли использовать их и цитировать при самостоятельном написании работ.


Это популяризирует авторские исследования и научные изыскания, что и является целью работы истинного ученого или публициста. Таким образом, наша база - электронная библиотека, созданная в помощь студентам и школьникам.


Уважаемые авторы! Если Вы все же возражаете против размещения Вашей публикации или хотите внести коррективы, напишите нам на почту info@corp.km.ru, мы незамедлительно выполним Вашу просьбу или требование.


официальный сайт © ООО «КМ онлайн», 1999-2026 О проекте ·Все проекты ·Выходные данные ·Контакты ·Реклама
]]>
]]>
Сетевое издание KM.RU. Свидетельство о регистрации Эл № ФС 77 – 41842.
Мнения авторов опубликованных материалов могут не совпадать с позицией редакции.

Мультипортал KM.RU: актуальные новости, авторские материалы, блоги и комментарии, фото- и видеорепортажи, почта, энциклопедии, погода, доллар, евро, рефераты, телепрограмма, развлечения.

Карта сайта


Подписывайтесь на наш Telegram-канал и будьте в курсе последних событий.



Организации, запрещенные на территории Российской Федерации
Политика конфиденциальности
Согласие на обработку файлов cookie

Мы используем файлы cookie и сервисы сбора технических данных для корректной работы сайта и анализа посещаемости. Продолжая пользоваться сайтом, вы соглашаетесь с обработкой этих данных.