You are on page 1of 19

Опашка

Съдържание
1. Какво е опашка?
2. Статична опашка
3. Динамична опашка

2
Какво е опашка?
 Опашката е структура от данни, която има поведение от
тип „първи влязъл, първи излиза“.
 Опашката може да се реализира:
 Статично, чрез масив
 Динамично, чрез възел със стойност и указател към
следващ елемент

4
СТРУКТУРА ОПАШКА

 Крайна редица от еднотипни елементи, за която са


разрешени три операции:
 Създаване на празна опашка;

 Добавяне на елемент към края на опашката;

 Извличане на елемент от началото на опашката.


СТРУКТУРА ОПАШКА
 Операцията включване е допустима само за единия край,
наречен КРАЙ на опашката.
 Изключването на елемент е допустимо само за НАЧАЛОТО
на опашката.
 За опашката е валиден принципът FIFO – First In First Out
/пръв влязъл, пръв излязъл/.
Пример /включване на елемент/
 Ако редицата
а1, а2, ….., аn

е опашка с начало а1 и край аn, то включването на елемент а


от тип, съвпадащ с типа на елементите на опашката, ще
доведе до получаването на редицата
а1, а2, ….., аn, а
Пример /изключване на елемент/
 Ако редицата
а1, а2, ….., аn

е опашка с начало а1 и край аn, то изключването на елемент води до


получаване на редицата
а2, а3,….., аn

с начало а2
Статична (кръгова) опашка
 Статична (базирана на масив) имплементация
 Имплементира се като „кръгов масив“
 Има ограничен капацитет (когато се запълни, се заделя двойно
място)
 Има индекси за начало (head) и край(tail), сочещи към началото
и края на кръговата опашка
0 1 2 3 4 5 6 7
Q 7 12 2 5

head tail
Свързана Опашка
 Динамична имплементация
 Всеки възел (node) има 2 полета: value и next
 Позволява динамично създаване и изтриване

head tail

2 7 4 5
next next next next

null
Queue<T> в .NET
 Queue<T> имплементира опашка чрез кръгов разтеглив
масив
 Елементите са от един и същ тип T

 T може да бъде какъв да е тип, например int / Queue<int> /


Queue<DateTime>
 Размерът се увеличава динамично при нужда
Queue<T> Базова функционалност
 Enqueue(T) – добавя елемент в края на опашката
queue.Enqueue(5);

 Dequeue() – премахва и връща елемента от началото


int number = queue.Dequeue();

 Peek() – връща елемента от началото без триене


int number = queue.Peek();

 Count – връща броя елементи в


int elementCount = queue.Count;
Queue<T> Базова функционалност (2)
 Clear() – премахва всички елементи
queue.Clear();

 Contains(T) – проверява дали елемент се среща в опашка


bool isFound = queue.Contains(5);

 ToArray() – преобразува опашка в обикновен масив


int[] arr = queue.ToArray();

 TrimExcess() – изтрива допълнителното място


queue.TrimExcess();
Пример:
Queue<string> queue = new Queue<string>();
queue.Enqueue("Message One");
queue.Enqueue("Message Two");
queue.Enqueue("Message Three");
queue.Enqueue("Message Four");

while (queue.Count > 0)


{
string msg = queue.Dequeue();
Console.WriteLine(msg);
} 14
Задачи
 В опашка последователно са постъпили елементите 7, 2, 8, 5,
3, 4, 1. От опашката се изваждат последователно три
елемента. Последният изваден елемент е….
Задачи
 Дадени са стек S и опашка Q. В стека са постъпили последователно
елементите 0, 0, 1, 3, 0, 0, 2, 5, 7, 0, 1, а опашката е празна. Изпълнява се
следният алгоритъм:
 Докато има елементи в стека , от него се изважда един елемент. Ако изваденият
елемент има ненулева стойност, той се добавя в опашката, в противен случай от
опашката се изважда един елемент /ако има такъв/ и веднага след това отново се
добавя към нея.
 След изпълнението на алгоритъма елементът в главата на опашката има стойност….
Задачи
 В опашка Q1 последователно са постъпили елементите 3, 2, 5, 8, -12, 4, а в
опашка Q2 – елементите 1, -1, 6, 22, -6, -5. Изпълнява се следният
алгоритъм:
 Изваждат се по един елемент от двете опашки и сборът им се прибавя към онази
опашка, от която е изваден елемент с по-голяма стойност. Действието се повтаря,
докато една от двете опашки се окаже празна. След изпълнението на алгоритъма
опашката Q1 е празна. Броят на елементите в опашката Q2 e…
Задача
 Да се състави програма, чрез която от клавиатурата се въвежда естествено число N от интервала
[10..100]. Програмата да генерира N броя естествени числа от интервала [1..101].
Числата да бъдат записани в списък / стек.
При извеждането елементите на стека числата да се разделят на четни и нечетни, като първо се
изведат всички четни, а след това всички нечетни числа.
Четните стойности се извеждат в същия ред, както са въвеждани, а нечетните стойности се извеждат в
ред обратен на въвеждането им.
Пример: 10 генерирани са 42 468 335 501 170 725 479 359 963 465
Изход: 42 468 170 465 963 359 479 725 501 335
Задачи
1. Да се напише програма, която създава опашка от цели числа, които се въвеждат от
клавиатурата дотогава, докато се въведе 999. Програмата извежда елементите на
опашката и броят им.
2. Да се напише програма, която само с едно обхождане на масив от числа(без
допълнителни масиви) извежда върху екрана елементите на масива в следния ред:
първо числата по-малки от 10, след това всички числа в интервала [10, 50] и накрая
всички останали числа.
Примерен вход:
15 8 1 13 45 123 21 47 74 189 12 9
Примерен изход:
8 1 9 15 13 45 21 47 12 123 74 189

You might also like