Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метода по ОАиП.doc
Скачиваний:
12
Добавлен:
11.05.2015
Размер:
3.21 Mб
Скачать

15.3. Структура данных очередь

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

Очередь также называют структурой данных, организованной по принципу FIFO (First In, First Out) – первый вошел (первый созданный элемент очереди), первый вышел.

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

Пример очереди – некоторый механизм обслуживания, который может выполнять заказы только последовательно один за другим. Если при поступлении нового заказа данное устройство свободно, оно немедленно приступит к выполнению этого заказа, если же оно выполняет какой-то ранее полученный заказ, то новый заказ поступает в конец очереди из других ранее пришедших заказов. Когда устройство освобождается, оно приступает к выполнению заказа из начала очереди, т.е. этот заказ удаляется из очереди и первым в ней становится следующий за ним заказ.

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

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

Шаблон элемента структуры, информационной частью которого является целое число, может иметь следующий вид:

struct Spis {

int info;

Spis *Next;

};

При организации очереди обычно используют два указателя

Spis*begin, *end;

где begin и end– указатели на начало и конец очереди соответственно, т.е. при создании очереди мы организуем структуру данных следующего вида:

каждый элемент которой имеет информационную infо и адресную Next (A1, A2, ...) части.

Основные операции с очередью следующие:

– формирование очереди;

– добавление нового элемента в конец очереди;

– удаление элемента из начала очереди.

15.3.1. Формирование очереди

Формирование очереди состоит из двух этапов: создание первого элемента, добавление нового элемента в конец очереди.

Создание первого элемента очереди

Этот этап заключается в создании первого элемента, для которого адресная часть должна быть нулевой (NULL). Для этого нужно:

1) ввести информацию для первого элемента (целое число i);

2) захватить память, используя текущий указатель:

t = (Spis*) malloc(sizeof(Spis)); или t = new Spis;

в результате формируется конкретный адрес (А1) для первого элемента;

3) сформировать информационную часть:

t -> info = i; (обозначим i1 )

4) в адресную часть занести NULL:

t -> Next = NULL;

5) указателям на начало и конец очереди присвоить значение t:

begin = end = t;

На этом этапе получим следующее:

Добавление элемента в очередь

Рассмотрим алгоритм добавления только для второго элемента.

1. Ввод информации для текущего (второго) элемента – значение i .

2. Захватываем память под текущий элемент:

t = (Spis*) malloc (sizeof(Spis)); или t = new Spis;

3. Формируем информационную часть (обозначим i2):

t -> info = i;

4. В адресную часть созданного элемента (текущего) заносим NULL, т.к. этот элемент становится последним:

t -> Next = NULL;

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

end -> Next = t;

бывший последний элемент становится предпоследним.

6. Переставляем указатель последнего элемента на добавленный:

end = t;

В результате получим

Для добавления в очередь любого количества элементов организуется цикл, включающий пункты 1– 6 рассмотренного алгоритма. Завершение цикла реализуется в зависимости от поставленной задачи.

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

void Create(Spis **begin, Spis **end) {

Spis *t = (Spis*) malloc(sizeof(Spis));

printf(“\n Input Info ”);

scanf(“%d”, &t -> info);

t -> Next = NULL;

if(*begin == NULL) // Формирование первого элемента

*begin = *end = t;

else {

(*end) -> Next = t; // Добавление в конец

*end = t;

}

}

Участок программы с обращением к функции Createдля добавление необходимого количества элементов в очередь может иметь следующий вид:

Spis *begin = NULL, *end;

int repeat = 1;

while(repeat) { //repeat=1 – продолжение ввода данных

Create(&begin, &end);

printf(“ Stop - 0 ”); // repeat=0 – конец ввода данных

scanf(“%d”, &repeat);

}