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

4 Стек. Черга

Стек – це структура даних, в якій елемент, записаний останнім, зчитується першим. Діє принцип LIFO – “Last Input First Output” (останнім прийшов, першим пішов)». Стек часто використовується в програмуванні для реалізації рекурсій.

Черга – це структура даних, в якій елемент, записаний першим, зчитується першим. Діє принцип FІFO – “First Input First Output” (першим прийшов, першим пішов).

Максимально припустимі розміри стека й черги – важливі характеристики реалізації мови програмування, які визначають коло завдань, які можна вирішити Стеки й черги описуються й створюються в пам'яті за допомогою списків.

4.1 Алгоритм побудови стека

  1. Визначити вказівник на перший елемент first:=nil;

  2. Виділити пам'ять для нового елемента new(curr);

  3. Занести значення даних за адресою вказівника, наприклад, readln (curr^.data);

  4. Зв'язати перший елемент з поточним curr^.next:=first;

  5. Вказівник на перший елемент перепризначити на поточний first:=curr; Повторити дії від пункту 2 доти, поки не закінчаться всі елементи.

4.2 Алгоритм побудови черги

  1. Виділити пам'ять для поточного елемента черги new(curr);

  2. Запам'ятати вказівник на перший елемент – first:=curr;

  3. Запам'ятати покажчик на попередній елемент ргеv:=curr;

  4. Ввести дані в пам'ять: rеadln(cuur^.data);

  5. Встановити вказівник на наступний елемент curr^.next:=nil;

  6. Зв'язати поточний елемент з попереднім, перепризначивши вказівник prev^.next:=curr;

  7. Виділити пам'ять для нового елемента й повторити дії пунктів 3 - 7.

Приклад 1:

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

Алгоритм

Список порожній.

Повторювати дії поки не буде натиснута клавіша:

Виведення списку на екран.

Додавання елемента списку й сортування списку:

- виділити пам'ять для нового елемента;

- ввести елемент в пам'ять;

- якщо список порожній, то перепризначити вказівник на новий елемент, вказівнику на наступний елемент - привласнити значення nil;

- якщо список не порожній, та якщо нове значення елемента менше першого, помістити елемент у початок списку;

- інакше пошук місця вставки нового елемента в списку елементів.

Вилучення заданого елемента:

- якщо список не порожній, то введення елемента, який необхідно вилучити;

- якщо необхідний елемент знайдено, то перепризначити вказівники;

- інакше пошук необхідного елемента, вилучення його й звільнення пам'яті.

Кінець.

program Din_Var;

{організація списку з операціями сортування елементів, виведення списку}

uses

crt;

type

ptr=^zap; {тип вказівника на запис}

zap=record

numbcr:string; {елемент даних}

next:ptr; {вказівник на наступний елемент}

end;

var

first:ptr; {вказівник на початок списку}

ch:char; {вибір режиму обробки списку}

newptr, {вказівник на введений елемент}

curr, {вказівник на наступний елемент}

prev:ptr; {вказівник на попередній елемент}

reg:string; {значення елементу даних}

done:boolean; {прапорець для пошуку місця вставки елементу}

{включення елементу в список}

procedure insert;

begin

write('Input element:'); readln(reg);

new(newptr); {виділення пам'яті для нового елементу)

newptr^.number:=reg; {введення даних в пам’ять}

if first=nil then

{формування першого елементу списку}

begin

first:=newptr; {вказівник початку списку па перший елемент} first^.next:=nil;{вказівник на наступний елемент}

end else {якщо список не порожній)

if reg<=first^.number then{якщо ціле значення менше існуючих}

{вставка нового елемента в початок списку}

begin

newptr^.next:=firsl; flrsl:=newptr;

end else {якщо ціле значення більше існуючих}

{пошук необхідного місця вставки}

begin

curr:=first; {вказівник поточного елемента вказує на перший}

repeat

prev:=curr; {вказівник попереднього елемента вказує на

поточний}

curr:=urr^.next;{вказівник поточного елемента вказує на

наступний}

if curr=nil

then done:=true

else done:=curr^.number>=reg;

until done; {переадресація пари вказівників до тих пір,

поки значення даного більше ніж ті, що є в

списку:until curr^.nutnber>=reg}

{вставка нового елементу}

prev^.next:=newptr;

newptr^.next:=curr;

end;

end; {кінець процедури}

{вилучення елементу зі списку, перший елемент витягаєтся останнім}

procedure delete;

begin

if first=il then {якщо список порожній}

begin

writeIn('List is empty. Press ENTER...');

readln;

end;

else begin {якщо список непорожній}

write('Input element:');

readln(reg); {введення значення, що буде вилучатись}

curr:=first;

if curr^:nuinber=reg then {якщо необхідний елемент знайдений}

first:=curr^.next

else

repeat {пошук необхідного елементу}

prev:=curr; {перепризначення вказівників}

curr:=curr^.next;{вказівник па попередній

елемент стає поточним вказівником, вказівник нa

поточний елемент вказує на наступний}

until (curr^.number=reg) or (curr^.next=nil);

{вилучення знайденого елементу й звільнення пам'яті}

if curr^.number=reg then {якщо елемент списку збігається із заданим}

begin

prev^.next := curr^.next;{переадресація вказівників}

dispose(curr); {звільнення пам'яті}

end

else begin {якщо елемент не знайдений}

writeln(reg,' not found in lisl. Press ENTER...');

readln;

end;

end;

end; {кінець процедури delele}

{виведення списку на екран}

procedure outlist;

begin

curr:=flrst; {поточний вказівник показує

на перший елемент}

if curr=nil then writeln ('Lisl is empty')

eIse begin

writeln('output Iisl:');

repeat

write(curr^.number,' ');{виведення значення елементу}

curr:=curr^.next; {поточним стає вказівник на

наступний елемент}

until curr=nil; {виведення значення, поки є

елементи в списку}

end;

writeln;

end;

{головна програма}

begin

first:=nil; {на початку список порожній}

repeat

elrser; outlist; {очищення екрана, виведення

списку на екран}

writeln('l – input D – delete Q - quit');

write('input command:');

readln(ch); ch:=upcase(ch);

case ch of

'I':insert;

'D':delete;

end;

until ch='Q';

end.

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