Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.doc
Скачиваний:
9
Добавлен:
22.09.2019
Размер:
812.03 Кб
Скачать

3.3 Очередь

Очередь – структура данных с двусторонним доступом, то есть в один конец структуры добавляются элементы, а с другого конца исключаются.

Очередь работает по принципу FIFO (First in – first out; первым пришел – первым ушел).

Структура данных очередь полностью аналогична обыденному пониманию этого слова. Когда человек занимает очередь в магазине, он становится в конец очереди, так и элемент, добавляемый в очередь, дописывается в ее конец. Когда приходит очередь брать товар, человек берет товар и уходит, так и при извлечении элемент берется из начала очереди.

Таким образом, для организации такой структуры используются две переменные: для указания начала и конца очереди.

Н а рисунке 3.7 изображена очередь, где указатель QBegin указывает на начало очереди, а указатель QEnd указывает на конец очереди.

Операции над очередями:

  • инициализация очереди – в очередь попадает первый элемент;

  • проверить на пустоту;

  • добавить элемент в конец;

  • взять элемент из начала.

П ризнаком пустоты очереди является QBegin=nil. Это связано с тем, что элементы из очереди берутся только из начала очереди. Операция извлечения элемента из очереди идентична удалению элемента из начала списка. На рисунке 3.8 показана последовательность действий при добавлении элемента в конец очереди.

Исходная очередь (а) состоит из трех элементов. С помощью операции new создаем новый элемент (б) с указателем QNew, в поле данных (QNew->Data) которого записываем некоторое значение; указатель на следующий элемент (QNew->Next) устанавливаем в NULL, что является признаком того, что этот элемент станет последним.

После этого "перекидываем" указатели так, как показано на фрагментах (в) и (г).

Пример реализации и работы с очередью.

В данном примере реализованы основные операции работы с очередью, элементами которой могут быть целые числа. Операции по заполнению и выводу элементов очереди на экран реализованы в виде функций, которые затем вызываются в основной программе.

В примере широко используется механизм формальных параметров функций, где QB, QE – указатели на начало и конец очереди соответственно; х – значение для поля данных.

В главной функции программы объявлены идентификаторы QBegin и QEnd, которые и являются фактическими переменными-указателями на начало и конец очереди, именно они передаются в функции (если необходимо) при их вызове.

#include <iostream.h>

//предварительное описание структуры элемента очереди

struct Node;

//описание типа указателя на элемент очереди

typedef Node* PNode;

//структура элемента очереди

struct Node

{

int Data;

PNode Next;

};

//Инициализация очереди: создается первый элемент очереди

//(который также пока является и последним), на него

//устанавливаются указатели QE и QB

void Init(PNode& QB, PNode& QE, int x)

{

QE = new Node;

QE->Data = x;

QE->Next = NULL;

QB = QE;

}

//проверка очереди на пустоту

int Empty(PNode QB)

{

return (!QB);

}

//Добавление элемента в конец очереди (см. рисунок 3.8)

void Insert(PNode& QE, int x)

{

PNode p = new Node;

p->Data = x;

p->Next = NULL;

QE->Next = p;

QE = p;

}

//Удаление элемента из начала очереди

//(аналогично удалению из начала списка)

void Remove(PNode& QB, int& x)

{

if (Empty(QB))

cout<<"Очередь пуста!";

else

{

PNode p;

x = QB->Data;

p = QB;

QB = QB->Next;

delete p;

}

}

//заполнение очереди элементами

void InputQueue(PNode& QB, PNode& QE)

{

int Data;

cout<<"Введите элементы (0 - конец ввода): ";

cin>>Data;

Init(QB,QE,Data);

do

{

cin>>Data;

if (Data!=0)

Insert(QE,Data);

}

while (Data!=0);

}

//Извлечение элементов из очереди и вывод их на экран

void PrintQueue(PNode QB)

{

int Data;

cout<<"Очередь:\n";

while (!Empty(QB))

{

Remove(QB,Data);

cout<<Data<<' ';

}

cout<<endl;

}

void main()

{

//фактические указатели на начало и конец очереди

PNode QBegin, QEnd;

InputQueue(QBegin,QEnd);

PrintQueue(QBegin);

}