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

3.11. Сд типу «дек»

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

Набір допустимих операцій для СД типу «дек»:

  • ініціалізація;

  • включення елемента справа;

  • включення елемента зліва;

  • виключення елемента справа;

  • виключення елемента зліва;

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

  • очищення.

Така структура даних є однією з найлегших для опрацювання серед зв’язних списків та поєднує позитивні сторонни реалізації списку у вигляді стеку та черги.

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

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

#include "stdio.h"

#include "conio.h"

struct node

{

int data; // описуємо структуру

struct node *next;

struct node *prev;

};

node *first(int data); // визначаємо перший елемент

node *add(node *p, int data); // додаємо елемент на початок

node *addAfter(node *head, int data); //додаємо елемент у кінець

node *del(node *del, int st); //знищуємо елемент

void view(node *head); //відображення дека

void delDek(node *head); //знищуємо дек

// головна програма

main()

{

node *head, *p;

head=NULL;

int m_gl, m_dob, m_ud, m_vi;

int data;

while(m_gl!=4)

{

clrscr();

printf("1. Додати елеметн.\n");

printf("2. Знищити елемент.\n");

printf("3. Вивести дек.\n");

printf("4. Вихід.\n");

gotoxy(1,6);

scanf("%i", &m_gl);

if(m_gl==1)

{

while(1)

{

clrscr();

if (head==NULL)

{

printf("Дек порожній. Введіть елемент: ");

scanf("%i", &data);

head = p = first(data);

}

clrscr();

printf(".....Додати елемент....\n");

printf("1. На початок.\n ");

printf("2. У кінець.\n");

printf("3. Повернутись назад.\n");

gotoxy(1,6);

scanf("%i", &m_dob);

if (m_dob==1)

{

clrscr();

printf("Додати елемент на початок.\n");

scanf("%i", &data);

head=addAfter(head, data);

}

if (m_dob==2)

{

clrscr();

printf("Додати елемент у кінець.\n");

scanf("%i", &data);

p=add(p, data);

}

if (m_dob==3) break;

}

}

if(m_gl==2)

{

while(1)

{ // виводимо меню програми

clrscr();

printf(" Знищити елемент....\n");

printf("1. На початку.\n");

printf("2. У кінці.\n");

printf("3. Очистити дек.\n");

printf("4. Повернутись назад.\n");

gotoxy(1,6);

scanf("%i", &m_ud);

if (m_ud == 2) p = del(p, m_ud);

else if (m_ud==1) head=del(head, m_ud);

else if (m_ud==3)

{delDek(head); head=NULL; printf("Дек очистили!");}

if (m_ud==4) break;

}

}

if (m_gl==3)

{

while(1)

{

clrscr();

if (head!=NULL) view(head);

else printf("Дек порожній.\n");

printf("1. Повернутись назад.\n");

scanf("%i", &m_vi);

if (m_vi==1) break;

}

}

}

}

node *first(int data)

{ //створюємо перший елемент

node *temp = new node;

temp->data=data;

temp->next=NULL;

temp->prev=NULL;

return temp;

}

node *add(node *p, int data)

{ // елемент зі значенням data розміщуємо після р

node *temp=new node;

temp->data=data;

temp->prev=p;

temp->next=NULL;

p->next=temp;

return temp;

}

node *addAfter(node *head, int data)

{ // елемент зі значенням data розміщуємо перед головою

node *temp = new node;

temp->data=data;

temp->next=head;

head->prev=temp;

temp->prev=NULL;

return temp;

}

void view(node *head)

{ // виводимо на екран значення елементів дека

node *t=head;

printf(".........DEK.........\n");

while(t)

{

printf("%i\t", t->data);

t=t->next;

}

printf("\n\n");

}

node *del(node *del, int st)

{ // знищуємо елемент зі значення st

node *temp;

if (st==2)

{

temp=del->prev;

temp->next=NULL;

delete del;

}

else if (st==1)

{

temp=del->next;

temp->prev=NULL;

delete del;

}

return temp;

}

void delDek(node *head)

{ // знищуємо усі елементи дека

node *t;

for(t=head; t!=NULL; t=t->next)

delete t->prev;

}

Резюме

1. Масив – послідовність елементів одного типу, який називається базовим. Математичною мовою масив – це функція з обмеженою областю визначення. Структура масивів однорідна. Для виділення окремого компонента масиву використається індекс.

2. Індекс – це значення спеціального типу, визначеного як тип індексу заданого масиву. Над масивом виконують операції: доступу, присвоювання, ініціалізації.

3. Способи організації масивів: рядок за рядком, стовпчик за стовпчиком, масив із масивів.

4. Множина – скінченний набір елементів одного типу, для яких не важливий порядок слідування і жоден з елементів не може бути два рази включений. Набір допустимих операцій над множиною: перетин, об’єднання, різниця, перевірка на належність.

5. Запис – послідовність елементів, які, в загальному випадку, можуть бути одного типу. Дескриптор СД типу «запис», на відміну від дескриптора СД типу «масив», залежить від кількості елементів запису.

6. Таблиця – послідовність записів, які мають однакову організацію. Такий окремий запис називається елементом таблиці. Найчастіше використовується простий запис. Отже, таблиця – це аґреґація елементів. Якщо послідовність записів впорядкована щодо певної ознаки, то така таблиця називається впорядкованою, інакше – таблиця невпорядкована. Таблиця може бути реалізована як відображення на масив чи як відображення на список.

7. Є такі класи операцій: конструктори, деструктори, модифікатори, спостерігачі, ітератори.

8. Стек – це послідовність, у якій включення й виключення елемента здійснюється з однієї сторони послідовності (вершини стека). Так само здійснюється й операція доступу. Структура функціонує за принципом LIFO (останній, що прийшов, обслуговується першим).

9. Черга – послідовність, у яку включають елементи з одного боку, а виключають – з іншого. Структура функціонує за принципом FIFO (надійшов першим, обслуговується першим).

10. Дек – це такий послідовний список, у якому як включення, так і виключення елементів може здійснюватися з обох кінців списку.

Контрольні запитання

1. Опишіть структури даних типу «масив».

2. Перерахуйте набір допустимих операцій для структури даних типу «масив».

3. Поняття дескриптора. Приклад.

4. Дескриптор структури даних типу «масив».

5.Структури даних типу «запис» (прямий декартовий добуток).

6. Структури даних типу «таблиця».

7. Класифікація структур даних типу «таблиця».

8. Класифікація операцій над структурами даних типу «таблиця».

9. Набір допустимих операцій для структури даних типу «таблиця».

10. Структури даних типу «стек».

11. Сукупність операцій, що визначають структуру типу «стек».

12. Дескриптор структури даних типу «стек».

13. Області застосування структури даних типу «стек».

14. Структури даних типу «черга».

15. Сукупність операцій, що визначають структуру типу «черга».

16. Дескриптор структури даних типу «черга».

17. Області застосування структури даних типу «черга».

18. Області застосування СД типу «дек».

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]