Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодичкаТ Алгор2012.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
472.06 Кб
Скачать

2.2. Стеки

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

- LIFO-Last In- First Out (останнім увійшов - першим вийшов);

  • магазинна пам'ять.

Елемент стека має вигляд:

struct node

{ int num; // ключове поле

float ball; // інформаційне поле: одне або декілька

node next; //покажчик на попередній елемент

};

Приклад.

Ввести з клавіатури n цілих чисел. Вивести елементи стека на екран. Підрахувати кількість позитивних елементів стеку.

Позначення:

top - покажчик на вершину стеку;

what - ціле число, що вводиться;

k – кількість позитивних елементів;

push - функція додавання елементу до стеку;

printstack - функція роздруківки елеменів стеку;

pop - функція видалення елементу із стеку.

Блок-схема головної (main) функції:

Блок-схема функції push додавання до стеку нового елемента

Блок-схема функції pop видалення останнього елемента стеку

Блок-схема функції printstack виведення на екран елементів стеку

ЦИКЛ

top<>0

ЦИКЛ

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

#include <iostream.h>

struct node

{

float num;

node* next;

} ;

// прототипи функцій

node* push(node* , float); // додавання елемента в стек

void printstack(node* ); // виведення на екран (читання) елементів стеку

node* pop(node*); // видалення елемента зі стеку

void main()

{

float what;

int n,i;

node* top=0;

cout<<"input n\n";

cin>>n;

cout<<endl;

// формування стеку з n елементів

cout<<"input what"<< n<<"value\n";

for (i=1;i<=n;i++)

{

cin>>what;

top= push(top, what);

}

// виведення на екран елементів стеку

printstack(top);

int k=0;

// підрахунок кількості позитивних елементів та звільнення пам’яті

while(top)

{

if (top->num > 0)

k++;

top= pop(top);

}

cout<<"k="<< k<<"\n";

}

node* push(node* top, float what)

{

node* pv=new node;

pv->num=what;

pv->next=top;

return pv;

}

void printstack(node* top)

{

float what;

cout<<"stek:\n";

while (top)

{

cout<<top->num<<" ";

top=top->next;

}

cout<<endl;

}

node* pop(node* top)

{

node* pv=top->next;

delete top;

return pv;

}

Варіанти індивідуальних завдань

  1. Перетворити стек у два стека. Перший повинен містити тільки додатні числа, а другий – від'ємні.

  2. Створити новий стек, що містить тільки парні числа з першого стека.

  3. Створити новий стек, що містить тільки ті числа з першого стека, які більше середнього арифметичного значення всіх елементів першого стека.

  4. Створити новий стек, що містить тільки додатні числа з першого стека.

  5. Підрахувати, скільки елементів стека має значення, яке перевищує середнє арифметичне значення всіх елементів стека.

  6. Знайти максимальне значення серед елементів стека.

  7. Знайти мінімальне значення серед елементів стека.

  8. Визначити, скільки елементів стека, починаючи з вершини, знаходиться до елемента з максимальним значенням.

  9. Визначити, скільки елементів стека, починаючи від вершини, знаходиться до елемента з мінімальним значенням.

  10. Визначити, скільки елементів стека, починаючи з вершини, знаходиться після елемента з максимальним значенням.

  11. Визначити, скільки елементів стека, починаючи від вершини, знаходиться після елемента з мінімальним значенням.

  12. Визначити, скільки елементів стека знаходиться між його мінімальним і максимальним елементами.

  13. Визначити, скільки елементів стека має значення менше середнього арифметичного значення всіх елементів стека.

  14. Визначити, скільки елементів стека має значення більше середнього арифметичного значення всіх елементів стека.

  15. Створити новий стек, що містить тільки числа, більші середнього значення всіх елементів першого стека.

  16. Перетворити стек у два стека. У перший помістити всі парні, а в другий – усі непарні числа.

  17. Створити новий стек, порядок проходження елементів у якому зворотний щодо першого стека.

  18. Створити новий стек, у який помістити кожний третій елемент першого стека.

  19. Створити новий стек, у який помістити елементи, що лежать у другій половині першого стека.

  20. Сформувати стек, що містить рядки й зберегти його в текстовому файлі.

  21. Відтворити стек, що містить рядки, з текстового файлу.

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

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

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

  25. У даному тексті перевірити відповідність відкриття й закриття дужок (через стек).

  26. Надрукувати вміст текстового файлу, виписуючи символи кожного його рядка у зворотному порядку (через стек).

  27. Видалити зі стека всі парні елементи.

  28. Видалити зі стека всі елементи, що знаходяться до максимального.

  29. Вставити в стек між другим і третім елементом максимальний елемент.

30.Вставити в стек перед максимальним елементом середньє арифметичне елементів стеку.