Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АП. Методичнi вказiвки.doc
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
1.25 Mб
Скачать

Лабораторна робота № 12 статистичнi I динамiчнi структури даних

Завдання: розробити алгоритми і написати програми, що реалізовують роботу магазинного і кільцевого стеків. У програмі передбачити дві версії: статичну і динамічну.

Стеком називається виділена (програмістом) область ОЗУ, для якої програмно організовані спеціальні режими функціонування:

-магазинний стек з дисципліною обслуговування "першим прийшов - останнім вийшов"

(FILO - first in, last out), або

-кільцевий стек з дисципліною "першим прийшов - першим вийшов" (FIFO - first in, first out).

Магазинний стек з дисципліною FILO.

Магазинний стек з дисципліною FILO <першим прийшов - останнім вийшов> є структурою з N виділених в ОЗУ під стек елементів ( ЯП) пам'яті і одного покажчика W вершиною стека, що є:

На логічному рівні робота стека FILO організована так, що операція запису-читання в/із стека завжди адресується до однієї і тієї ж ЯП - вершині стека W - і супроводжується для збереження попередньої інформації одночасним (паралельним) перенесенням (витісненням) вмісту молодших ЯП в старших при записі і навпаки із старших в молодших при читанні.

На фізичному рівні робота стека реалізується виключно просто і без

яких-небудь перезаписів або обмінів вмістом між ЯП, виділеними в ОЗУ під стек, а саме інкрементом/декрементом покажчика вершини W стека (продумайте це!).

Алгоритм Стек_filo (магазинний стек)

Організовує і підтримує стекову пам'ять з дисципліною обслуговування <першим прийшов - останнім вийшов>.

Прийоми програмування - покажчики і заглушки.

Крок 0. Початок.

Крок 1. Модуль диспетчера:

[ініціалізація покажчиків і пам'яті]

W = 0 (покажчик вершини стека)

input <Кількість елементів пам'яті під стек N=> N

dim S(N) (резервування пам'яті, S(i) - що зберігається в i-й ЯП дане)

DIALOG: [інтерфейс з користувачем]

print < Вкажіть вид операції:>

print < вписати дане в стек (1)>

print < видати дане із стека (2)>

print < друк вмісту стека (3)>

print < кінець роботи (4)>

input O: on O goto WWOD, WUWOD, PRT, ENDE

else goto DIALOG.

Крок 2. Модуль запису даного в стек:

WWOD:

input <Введіть даного M=> M

W = W + 1 (інкремент покажчика вершини)

[заглушка для запобігання виходу покажчика W за межі стека]

if W > N then [повідомлення про помилку]

print <ПЕРЕПОВНЮВАННЯ СТЕКА!>

[відновлення значення покажчика вершини]

W = W - 1

else S(W)= M (запис даного в стек) fi

Крок 3. Модуль читання даного із стека:

WUWOD:

[заглушка для виродженого випадку "порожній стек"]

if W = 0 then [повідомлення про помилку]

print <СТЕК ПОРОЖНІЙ!>

else

[видача даного із стека, звільнення ЯП(тільки у учбових цілях для наочності роботи модуля 4 - друк вмісту стека) і декремент покажчика вершини]

M = S(W) and S(W)=0 and W = W - 1 and print M

Fi

Крок 4. Модуль друку вмісту стека:

PRT:

print <Вершина стека W=> W

for I = 1 to N do

print S(i)

od

goto DIALOG.

Крок 5. Кінець:

ENDE: end.

КІЛЬЦЕВИЙ СТЕК з дисципліною FIFO

Кільцевий стек з дисципліною FIFO <першим прийшов - першим вийшов> є структурою з N виділених під стек ЯП і двох покажчиків:

F (first) - для вказівки ЯП, що містить перше записане в стек дане

і L (last) - для вказівки ЯП, що містить останнє записане в стек дане (в порядку надходження останніх):

Для запису чергового даного в стек досить виконати інкремент покажчика L і занести це дане в ЯП, на яку показуватиме L, а для читання - вивести вміст ЯП, на яку показує покажчик F, і потім виконати інкремент F, щоб забезпечити читання наступне дане. При цьому, для уникнення непорозумінь необхідно кожного разу відстежувати положення F і L щодо один одного і меж стека:

(i) досягнення L верхньої межі N ще не означає, що в стек більше не можна записувати дані, оскільки в межі N-1 попередніх ЯП можуть бути вже порожніми і використовуватися повторно. Тому після запису даного в ЯП з номером L=n і

(ii) необхідності запису наступного даного L повертається в початок стека і порівнюється з F: якщо L=f, то стек заповнений повністю і подальший запис в нього не можливий. Тоді L необхідно повернути на колишнє місце і вивести повідомлення про помилку СТЕК ПЕРЕПОВНЕНИЙ, інакше - продовжити працю стека за описаною схемою;

(iii) при читанні кожного разу необхідно порівнювати F з L і при F>l видати повідомлення про помилку СТЕК ПОРОЖНІЙ, а F повернути на колишнє місце. Крім того при F>n його алогічно L також необхідно перемістити в початок стека і повторити (iii) спочатку;

(iv) і, нарешті, при записі одночасне F=l=0 означає вiдсутнiсть стека і вимагає його створення (ініціалізації).