Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
48
Добавлен:
06.02.2018
Размер:
22.26 Кб
Скачать

Мета роботи

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

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

1. Які операції виконуються над рядками?

Над динамічним рядком найчастіше виконуються такі операції:

1. Пошук заданого елемента у рядку.

2. Вставка заданого елемента у певне місце рядка.

3. Видалення заданого елемента з вказаного місця рядка.

Найчастіше ці операції подаються у вигляді функції або процедур.

Застосування функцій та процедур простіше в динамічних рядках з ланкою заголовком, оскільки, як перша, так і наступні літери рядка формуються і

обробляються за однаковими правилами.

2. Що таке однонаправлений список, чим він відрізняється від рядка?

Розглянутий раніше рядок, зображений у вигляді ланцюжка символів, є частковим випадком лінійного однонаправленого списку. Для рядка елементами є символи. Для однонаправленого списка – елементами можуть бути значення будь-якого типу: дійсні числа, масиви, записи тощо. Принцип організації та роботи з лінійним однонаправленим списком такий самий, як із рядком. Кожен елемент, що входить у однонаправлений список, має вказівник на наступний елемент. Лінійні однонаправлені списки можуть бути як із ланкою-заголовком, так і без неї. Слід пам’ятати, що тип елементів однонаправленого списку повинен бути однаковий. За лінійним однонаправленим списком можна рухатися лише в одному напрямку від початку до кінця і кожен раз повертатися на його початок оператором: VLAN := VSLOV;

3. Які поля містить двонаправлений список?

На практиці часто виникає потреба провести обробку попереднього елемента у списку. У однонаправленому списку необхідно вертатися на початок рядка, переглянути всі елементи, до того, який потрібний. Це незручно

і нераціонально. Тому для подібних задач доцільно створити двонаправлений список, тобто список, у якому можна рухатися у двох напрямках: як вперед, так і назад. У разі створення такого списку в запис додається ще одне поле – PRIV –

вказівник на попередній елемент.

3. Що таке двонаправлений кільцевий список?

Функція пошуку елемента у двонаправленому списку практично не

відрізняється від аналогічної функції для однонаправленого списку. Головне

перебрати всі елементи або спочатку до кінця, або від кінця до початку.

FUNCTION POSH (ST :ZV2; BUK : CHAR: VAR REZ :

ZV2):BOOLEAN;

Формальними параметрами будуть:

ST – вказівник на рядок;

BUK – символ або елемент, який шукається;

REZ – параметр-змінна через який передається вказівник на перше

входження заданого символу.

4. Який оператор необхідно передбачити у програмі, щоб перейти на

початок однонаправленого та двонаправленого списку?

Схематично алгоритм видалення заданого елемента з двонаправленого

списку зображений на рис. 8.

Щоб видалити елемент В, необхідно:

1. У поле NEXT елемента А записати вказівник на елемент С.

2. У поле PRIV елемента С записати вказівник на елемент А.

5 . Що таке черга, який режим обслуговування черги?

У програмуванні існує структура даних, яка називається чергою. Вона

використовується для моделювання реальної черги. За своїм змістом черга є

суто динамічним об’єктом. Довжина черги (набір її елементів) у часі постійно

змінюється.

Над чергою визначені дві операції:

1. Занести елемент у чергу.

2. Видалити елемент з черги.

У черзі доступні дві позиції:

1. Початок черги.

2. Кінець черги.

За дисципліною обслуговування розрізняють два види черг:

1. FIFO (First In First Out) – “перший прийшов – перший пішов”.

2. LIFO (Last In First Out) – “останній прийшов – перший пішов”.

6. Які операції виконуються над стеком?

ині стека, присвоюється змінній А та повертається у головну програму.

Ланка, в якій був цей елемент, виключається із стека.

PROCEDURE VDSTEK(VAR ST : ZV; VAR A : CHAR);

BEGIN

A := ST↑.ELEM;

ST := ST↑.NEXT

END;

Ця процедура дуже проста, але вона має два недоліки:

1) елемент, який видаляється із стека не знищується, що призводить до “засмічення” пам’яті машини;

2) якщо стек виявиться пустим, то результат виконання процедури буде

невизначеним.

Тому у процедуру слід додати фрагмент перевірки, чи стек не є пустим, і

процедуру видалення динамічного елемента:

PROCEDURE VDSTEK(VAR ST : ZV; VAR A : CHAR);

VAR Q : ZV;

BEGIN

IF ST = NIL THEN WRITELN(’СТЕК ПУСТИЙ’)

ELSE

BEGIN

A := ST↑.ELEM;

Q := ST;

ST := ST↑.NEXT;

DISPOSE(Q)

END

END;

7. Що таке “вершина стека”?

Під час розроблення трансляторів виникає потреба перевірити баланс

дужок в арифметичних виразах. Для цієї задачі використовується стек. Алго-

ритм полягає в тому, що кожна ліва дужка “(“ записується у стек, коли

виявляється права дужка “)”, то ліва дужка зі стека видаляється. Якщо після

закінчення перегляду вхідного рядка стек порожній, то це означає, що є баланс

дужок. У всіх інших випадках баланс дужок не виконується

Індивідуальне завдання

20.Сформувати чергу, елементами якої є слова. Перевірити, чи входять у

неї слова “IF”. Вивести чергу і повідомлення про входження слів.

Текст програми

program lab13(input,output);

uses crt;

type

zv=^pointer;

pointer=record

elem:char;

next:zv;

end;

var

vlan,vslov:zv;

sym:char;

l:boolean;

procedure vstav(lanka:zv; buk:char);

var

q:zv;

begin

new(q);

q^.elem:=buk;

q^.next:=lanka^.next;

lanka^.next:=q;

end;

procedure vudal(lanka:zv);

var

q:zv;

begin

q:=lanka^.next;

lanka^.next:=lanka^.next^.next;

dispose(q);

end;

begin

clrscr;

new(vslov);

vslov^.next:=nil;

vlan:=vslov;

writeln('Введіть символи');

repeat

read(sym);

vstav(vlan, sym);

vlan:=vlan^.next;

until sym='.';

writeln('String =');

vlan:=vslov;

vlan:=vlan^.next;

while vlan^.next<>nil do

begin

write(vlan^.elem);

vlan:=vlan^.next;

end;

writeln;

vlan:=vslov;

while vlan^.next<>nil do

begin

if (vlan^.elem=' ') and

(vlan^.next^.elem='i') and

(vlan^.next^.next^.elem='f') and

(vlan^.next^.next^.next^.next^.elem=' ') then

begin

l:=true;

end;

vudal(vlan);

end;

writeln('L=',l);

end.

Висновки

Виконуючи цю лабараторну роботу, я навчилась використовувати та застосовувати стеки, черги та одно- і дво- нааправлені списки, а також виконувати дії над ними.

Соседние файлы в папке Програмування Pascal