Очередь

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

 


Рис. Очередь

 

Описание очереди выглядит следующим образом:

struct имя_типа {

информационное поле;

адресное поле1;

адресное поле2;

};

где информационное поле – это поле любого, ранее объявленного или стандартного, типа;

адресное поле1, адресное поле2 – это указатели на объекты того же типа, что и определяемая структура, в них записываются адреса первого и следующего элементов очереди.

Например:

1 способ: адресное поле ссылается на объявляемую структуру.

struct list2 {

type pole1;

list2 *pole1, *pole2;

}

2 способ: адресное поле ссылается на ранее объявленную структуру.

struct list1 {

type pole1;

list1 *pole2;

}

struct ch3 {

list1 *beg, *next ;

}

 

В очереди добавление осуществляется в один конец, а удаление из другого конца. Для очереди можно определять функции:

· доступ к первому элементу;

· доступ к последнему элементу;

· добавление элемента в начало;

· удаление элемента из конца.

 

Пример 3. Основные функции над элементами очереди.

#include <iostream.h>

#include <stdlib.h>

 

struct Node {//описание структуры очереди

int number; //информационное поле

Node* last; //указатель на первый элемент

Node* next; //указатель на следующий элемент

};

 

void main() {

Node* head = NULL;

Node* tail = NULL;

Node* ptrLast = NULL;

short action = -1;

while(1) {

cout << "1. Добавить Элемент\n";

cout << "2. Просмотр Очереди\n";

cout << "3. Удалить Элемент\n";

cout << "4. Поиск Элемента\n";

cout << "0. Выход\n\n";

cout << "Ваш Выбор: ";

cin >> action;

if (action == 0) break;

if (action == 1) {//добавление элемента в начало очереди

int numb = -1;

cout << "Введите Число: ";

cin >> numb;

Node* ptr = new (Node);

ptr->number = numb;

ptr->next = NULL;

tail = ptr;

if (head == NULL) {

head = ptr;

ptrLast = ptr;

ptr->last = NULL;

continue;

}

ptr->last = ptrLast;

ptrLast->next = ptr;

ptrLast = ptr;

continue;

}

if (action == 2) { //просмотр очереди

Node* ptr = NULL;

if (head == NULL) {

cout << "\t!!! ОЧЕРЕДЬ ПУСТА !!!\n\n";

continue;

}

cout << "* * * * * ОЧЕРЕДЬ * * * * *\n\n";

ptr = tail;

while (1) {

cout << ptr->number<<" ";

if (ptr->last == 0)

break;

ptr = ptr->last;

}

cout << "\n\n";

continue;

}

if (action == 3) {//удаление элемента из хвоста очереди

Node* ptrDelete = NULL;

if (head == NULL) {

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

cout << "\t!!! ОЧЕРЕДЬ ПУСТА !!!\n\n";

continue;

}

if (head->next == NULL){

head = NULL;

tail = NULL;

delete (tail);

continue;

}

ptrDelete = head;

head = ptrDelete->next;

head->last = NULL;

delete (ptrDelete);

continue;

}

if (action == 4) {//поиск элемента в очереди

Node* ptr = NULL;

int key = -1;

if (head == NULL) {//в пустой очереди элементов нет

cout << "\t!!! СПИСОК ПУСТ !!!\n\n";

continue;

}

cout << "Введите Элемент Для Поиска: ";

cin >> key;

ptr = head;

while (1) {

if (key == ptr->number) {

cout << "\n\t!!! ЭЛЕМЕНТ НАЙДЕН !!!\n";

break;

}

if (ptr->next == NULL){

cout << "\n\t!!! ЭЛЕМЕНТ НЕ НАЙДЕН !!!\n";

break;

}

ptr = ptr->next;

}

continue;

}

if (action > 4){

cout << "\t!!! НЕВЕРНЫЙ ВЫБОР. ПОВТОРИТЕ ВВОД !!!\n\n";

continue;

}

}

}

 

Перед компиляцией кода в среде MSVC++ необходимо в меню Options/Project отключить режим Use Microsoft Foundation Classes.

 

 

Задания

1.Наберите коды программ из Примеров 2 и 3. Выполните компиляцию и запуск программ.

2.Опишите стек с целочисленным информационным полем. Заполните его длинами строк, считанных из файла. Распечатайте на экране содержимое стека. Укажите номер и длину последней самой короткой строки файла.

3.Разработайте программу, с помощью которой можно определить наибольший допустимый размер очереди с вещественным информационным полем. Найдите этот размер (число элементов в очереди).

Домашние задания

1.Наберите код программы из Примера 1. Выполните компиляцию и запуск программы.

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

3.Разработайте программу, с помощью которой можно определить наибольший допустимый размер стека с вещественным информационным полем. Найдите этот размер (число элементов в стеке). Сравните с наибольшим допустимым размером очереди с аналогичным информационным полем.

 









Дата добавления: 2015-02-16; просмотров: 1626;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.015 сек.