Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторний практикум інф сис та стр даних.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.39 Mб
Скачать

Тривалість роботи

Вхідний контроль, виконання лабораторної роботи, формування отриманих результатів у формі письмового звіту згідно завдання, аналіз результатів роботи та висновки, захист роботи виконуються протягом двох аудиторних занять.

Теоретичні відомості

Чергою FІFO (Fіrst - Іn - Fіrst- Out - "першим прийшов - першим вийшов") називається така послідовність зі змінною довжиною, у якій додавання елементів виконується тільки з однієї сторони (цю сторону часто називають кінцем або хвостом черги), а вилучення - з іншої сторони (називають початком або головою черги). Ті самі черги до прилавків і до кас, які ми так не любимо, є типовим побутовим прикладом черги FІFO.

Основні операції над чергою - ті ж, що й над стеком - додавання, вилучення, визначення розміру, читання, що не руйнує чергу.

Оскільки черга - це важлива абстракція даних, у стандартній бібліотеці С++ передбачений клас queue, для використання якого потрібно включити заголовочний файл:

#include < queue>

Набір стандартних операцій роботи зі стеком показаний у таблиці:

Операція

Дія

empty()

Повертає true, якщо черга порожня, і false у противному випадку

sіze()

Повертає кількість елементів у черзі

pop()

Видаляє елемент з черги, але не повертає його значення

front()

Повертає значення елемента з початку черги, але не видаляє його

push(іtem)

Поміщає новий елемент у кінець черги

Розглянемо статичну реалізацію черги на основі масиву з фіксованим рзміром. В наведенному далі лістінгу показано заголовочний файл для шаблонного класу queue, аналогічний класу queue зі стандартної бібліотеки шаблонів STL.

// ФАЙЛ: queue1.h (частина простору імен main_savitch_8B)

#ifndef MAIN_SAVITCH_QUEUE1_H

#define MAIN_SAVITCH_QUEUE1_H

#include <cstdlib> // Provides size_t

namespace main_savitch_8B

{

template <class Item>

class queue

{

public:

// ОПЕРАТОРИ ПЕРЕІМЕНОВАННЯ ТИПІВ ТА КОНСТАНТНІ ЧЛЕНИ

typedef std::size_t size_type;

typedef Item value_type;

static const size_type CAPACITY = 30;

// КОНСТРУКТОР

queue( );

// МОДИФІКУЮЧІ ФУНКЦІЇ-ЧЛЕНИ

void pop( );

void push(const Item& entry);

// КОНСТАНТНІ ФУНКЦІЇ-ЧЛЕНИ

bool empty( ) const { return (count == 0); }

Item front( ) const;

size_type size( ) const { return count; }

private:

Item data[CAPACITY];

size_type first;

size_type last;

size_type count;

// ДОПОМІЖНІ ФУНКЦІЇ-ЧЛЕНИ

size_type next_index(size_type i) const { return (i+1) % CAPACITY; }

};

}

#include "queue1.template" // Директива включення реалізації.

#endif

Файл реалізації класу queue показаний в наступному лістінгу:

#include <cassert> // Надає макрос assert.

namespace main_savitch_8B

{

template <class Item>

const typename queue<Item>::size_type queue<Item>::CAPACITY;

template <class Item>

queue<Item>::queue( )

{

count = 0;

first = 0;

last = CAPACITY - 1;

}

template <class Item>

Item queue<Item>::front( ) const

{

assert(!empty( ));

return data[first];

}

template <class Item>

void queue<Item>::pop( )

{

assert(!empty( ));

first = next_index(first);

--count;

}

template <class Item>

void queue<Item>::push(const Item& entry)

{

assert(size( ) < CAPACITY);

last = next_index(last);

data[last] = entry;

++count;

}

}

Дек - особливий вид черги. Дек (від англ. deq - double ended queue, тобто черга із двома кінцями) - це така послідовність, у якій як додавання, так і вилучення елементів може здійснюватися з кожного із двох кінців. Окремий випадок дека - дек з обмеженим входом і дек з обмеженим виходом. Логічна й фізична структури дека аналогічні логічній і фізичній структурі кільцевої FіFO-черги. Однак, стосовно до дека доцільно говорити не про початок і кінець, а про лівий і правий кінці. Динамічна реалізація дека є об'єднанням стека і черги.

Операції над деком:

  • додавання элемента справа;

  • додавання элемента зліва;

  • вилучення элемента справа;

  • вилучення элемента зліва;

  • визначення розміру.

Задачі, що вимагають використання структури дека, зустрічаються в обчислювальній техніці і програмуванні набагато рідше, ніж завдання, реалізовані на структурі стека або черги. Як правило, вся організація дека виконується програмістом без яких-небудь спеціальних засобів системної підтримки.

Прикладом дека може бути, наприклад, якийсь термінал, у який вводяться команди, кожна з яких виконується якийсь час. Якщо ввести наступну команду, не дочекавшись, поки закінчиться виконання попередньої, то вона встане в чергу й почне виконуватися, як тільки звільниться термінал. Це FІFO черга. Якщо ж додатково ввести операцію скасування останньої введеної команди, то отримаємо дек.