
- •Лабораторна робота № 4 Структура даних черга
- •1. Мета роботи
- •2. Теоретичні відомості
- •3. Порядок виконання роботи
- •1. Мета роботи.
- •5. Завдання на лабораторну роботу
- •6. Вибір індивідуального завдання
- •8. Контрольні запитання
- •Постановка задачі
- •3. Динаміка вмісту черги(або деку)
- •Умова не виконується!
- •4. Алгоритм розв’язання задачі
- •5. Результати виконання програми
Лабораторна робота № 4 Структура даних черга
1. Мета роботи
Вивчення фундаментальної абстрактної структури даних - черги. Набуття практичних навичок побудови черги, дослідження динаміки її вмісту та використання черг для розв'язання прикладних задач.
2. Теоретичні відомості
Чергою FІFO (Fіrst - Іn - Fіrst- Out - "першим прийшов - першим вийшов") називається така послідовність зі змінною довжиною, у якій додавання елементів виконується тільки з однієї сторони (цю сторону часто називають кінцем або хвостом черги), а вилучення - з іншої сторони (називають початком або головою черги). Ті самі черги до прилавків і до кас, які ми так не любимо, є типовим побутовим прикладом черги FІFO.
Основні операції над чергою - ті ж, що й над стеком - додавання, вилучення, визначення розміру, читання, що не руйнує чергу.
Приклад 1:
В послідовності 8 2 6 3 1 4 9 кожна парна цифра визначає операцію push (додавання цієї цифри в чергу), а кожна непарна цифра визначає операцію pop (вилученя з черги одного елемента).
-
Введемо такі позначення: P – вказівник на початок черги, К – вказівник на кінець черги
Нижче показана динаміка вмісту черги під час обробки заданої послідовності:
K
P
0)
- порожня черга
P K
P K
P K
1)
8
2)
8
2
3)
8
2
6
P K
P K
P K
4)
2
6
5)
6
6)
6
4
P K
7)
4
Оскільки черга - це важлива абстракція даних, у стандартній бібліотеці С++ передбачений клас 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 черга. Якщо ж додатково ввести операцію скасування останньої введеної команди, то отримаємо дек.