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

3.9.1. Дескриптор сд типу «стек»

Дескриптор СД типу «стек» містить:

  • адреси початку та кінця стека,

  • адресу вказівника,

  • опис елементів

S

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

Стек використовується при перетворенні рекурсивних алгоритмів у нерекурсивні. Зокрема, за допомогою стека можна модифікувати алгоритм сортування Хоора (описаний у наступних розділах) [4, 7, 8].

Стек використовується при розробленні компіляторів.

Cтеки вплинули й на архітектуру комп’ютера, послужили основою для стекових машин. У такого комп’ютера акумулятор виконаний у вигляді стека, що дозволяє розширити спектр безадресних команд, тобто команд, що не вимагають явного задання адрес операндів. Наслідком використання стека є збільшення швидкості опрацювання.

3.10. Сд типу «черга»

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

Рис. 3.3. СД типу «черга».

При реалізації черги розглядаються черга як відображення на масив (напівстатична реалізація) і черга як відображення на список.

Відображення на масив:

int a[100]; // оголошення черги

int n=0; // індекс останнього елемента у черзі

int current=0; // індекс «голови», діє принцип FIFO

void pop () // функція видобування (вилучення) елемента з черги

{

if (n!=0)

{ current++; // зсунули «голову» на один елемент вперед

printf(“%d%, a[current]);

}

}

void push () // функція додавання елемента до черги

{

if (!current) // черга порожня

{ scanf(“%d%, &a[current]); }

else

if (n<99)

{ // збільшили кількість елементів

n++; // додали елемент у кінець черги

scanf(“%d%, &a[n]);

}

}

Відображення на список:

struct cherga {

int el; // значення елемента

struct charga *next;} ch // адреса наступного елемента

ch *head, *p1, *p2; //вказівник на «голову», допоміжні вказівники

ch* push(int a; ch *cur)

// функція додавання елемента,

// а – значення, яке треба внести у чергу

// cur – останній елемент черги

{ ch *p;

// якщо черга порожня

if(!cur)

{ // створюємо вершину

cur=(ch*)malloc(sizeof(ch));

cur->el=a;

cur->next=NULL;

return(cur);

}

else

{ // створюємо новий елемент та додаємо його у кінець

p=(ch*)malloc(sizeof(ch));

p->el=a;

сur->next=p;

return(p);

}

}

ch* pop() // видалення вершини черги

{ ch *p;

if(head) // якщо в черзі є елементи

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

p=head->next;

// знищуємо «голову»

free(head);

return(p);

}

else return (NULL);

}

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

  • Операція ініціалізації.

  • Операція включення елемента в чергу.

  • Операція виключення елемента із черги.

  • Операція перевірки: черга порожня / черга не порожня.

  • Операція перевірки: черга переповнена / черга не переповнена.

У послідовній пам’яті черга має такий вигляд, як на рис. 3.4.

Тут: Uk1 – вказівник на «голову» (початок) черги, Uk2 – вказівник на «хвіст» (кінець) черги.

Щоб уникнути переповнення, раціонально використати кільцеву чергу. При цьому Uk1 > Uk2 або Uk2 > Uk1. У випадку ж якщо черга не кільцева, то завжди Uk2 > Uk1. Якщо черга порожня або переповнена, то Uk1 = Uk2.

Рис. 3.4. Структура даних типу «черга» у послідовній пам’яті.

Нехай n – поточний стан черги, а N – кількість елементів у черзі, тоді маємо умову 0  nN, і значення n може бути умовою перевірки стану черги. Операція включення можлива, якщо n < N, а операція виключення – якщо n > 0. У випадку кільцевої черги при операції модуля вказівники будуть змінюватися так: Uk1= Uk1 mod N + 1, Uk2 = Uk2 mod N + 1.

Схема на фізичному рівні СД типу «черга» виглядає так:

Дескриптор:

Області застосування СД типу «черга»

Черга використається при передаванні даних з оперативної у вторинну пам’ять (при цьому відбувається процедура буферизації: накопичується блок і передається у вторинну пам’ять). Наявність буфера забезпечує незалежність взаємодії процесів між виробником і споживачем (рангування задач користувача). Задачі розділяються за пріоритетами:

  • задачі, розв’язувані в режимі реального часу (вищий пріоритет) (черга 1);

  • задачі, розв’язувані в режимі розділення часу (черга 2);

  • задачі, розв’язувані в пакетному режимі (фонові задачі) (черга 3).

Доступ до елементів черги здійснюється послідовно.

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