- •Введення
- •Список лабораторних робіт
- •Оформлення звіту по лабораторній роботі
- •Правила написання програм
- •Правила виконання схем алгоритмів
- •Лабораторна робота № 1 лінійний обчислювальний процес
- •Лабораторна робота № 2 обчислювальний процес, що розгалужується
- •Лабораторна робота № 3 циклічний процес
- •Лабораторна робота № 4 типи даних, визначувані програмістом
- •Лабораторна робота № 5 робота з одновимірними і двовимірними масивами
- •Лабораторна робота № 6 сортування одно і двовимірних масивів.
- •Лабораторна робота № 7 функції і процедур, визначувані програмістом
- •Лабораторна робота № 8 модулі і динамічно зв'язувані бібліотеки.
- •Лабораторна робота № 9 множини і операції над ними
- •Лабораторна робота № 10 комбіновані типи (записи )
- •Лабораторна робота № 11 файли і робота з ними
- •Лабораторна робота № 12 статистичнi I динамiчнi структури даних
- •Лабораторна робота № 13 лабіринт
- •Лабораторна робота № 14 евристики.
- •Лабораторна робота № 15 класи
Лабораторна робота № 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сть стека і вимагає його створення (ініціалізації).