
- •Загальні методичні вказівки
- •Лабораторна робота № 1 Представлення в пам’яті комп’ютера даних цілих та дійсних типів
- •Тривалість роботи
- •Основні теоретичні положення
- •Порядок виконання роботи та методичні рекомендації щодо виконання роботи
- •Вимоги до оформлення звіту
- •Контрольні запитання
- •2. Знайти внутрішні представлення впк цілих та дійсних типів даних:
- •2.Індивідуальне завдання на лабораторну роботу
- •3.Алгоритм розв’язання задачі.
- •4.Система тестів
- •Лабораторна робота № 2 Перетворення типів даних
- •Вибір індивідуального завдання
- •Тривалість роботи
- •Основні теоретичні положення
- •Порядок виконання роботи та методичні рекомендації щодо виконання роботи
- •Вимоги до оформлення звіту
- •Контрольні запитання
- •Постановка задачі
- •3. Хід роботи Завдання 1
- •Завдання 2
- •4. Додаток
- •Лабораторна робота № 3 Структура даних стек
- •Вибір індивідуального завдання
- •Тривалість роботи
- •Основні теоретичні положення
- •Порядок виконання роботи та методичні рекомендації щодо виконання роботи
- •Вимоги до оформлення звіту
- •Контрольні запитання
- •Постановка задачі
- •3. Динаміка вмісту стеку(або масиву)
- •4. Алгоритм розв’язання задачі
- •5. Результати виконання програми
- •Лабораторна робота № 4 Структура даних черга
- •Вибір індивідуального завдання
- •Тривалість роботи
- •Теоретичні відомості
- •Порядок виконання роботи та методичні рекомендації щодо виконання роботи
- •Вимоги до оформлення звіту
- •Контрольні запитання
- •Постановка задачі
- •3. Динаміка вмісту черги(або деку)
- •4. Алгоритм розв’язання задачі
- •5. Результати виконання програми
- •Лабораторна робота № 5 Структура даних список
- •Вибір індивідуального завдання
- •Тривалість роботи
- •Основні теоретичні положення
- •Порядок виконання роботи та методичні рекомендації щодо виконання роботи
- •Вимоги до оформлення звіту
- •Контрольні запитання
- •2. Постановка задачі
- •3. Алгоритм розв’язання задачі.
- •4. Динаміка вмісту стеку.
- •Результати виконання програми
- •Лабораторна робота № 6 Методи сортування. Алгоритм вибірки
- •Індивідуальне завдання
- •Тривалість роботи
- •Основні теоретичні положення
- •Порядок виконання роботи та методичні рекомендації щодо виконання роботи
- •Вимоги до оформлення звіту
- •Контрольні запитання
- •2. Теоретичні відомості
- •Завдання:
- •Код програми
- •Лабораторна робота № 7 Методи сортування. Алгоритм бульбашки
- •Індивідуальне завдання
- •Тривалість роботи
- •Основні теоретичні положення
- •Порядок виконання роботи та методичні рекомендації щодо виконання роботи
- •Вимоги до оформлення звіту
- •Контрольні запитання
- •2. Теоретичні відомості
- •Завдання:
- •Перелік рекомендованих джерел
Тривалість роботи
Вхідний контроль, виконання лабораторної роботи, формування отриманих результатів у формі письмового звіту згідно завдання, аналіз результатів роботи та висновки, захист роботи виконуються протягом двох аудиторних занять.
Основні теоретичні положення
Стек - динамічна структура даних, що представляє собою впорядкований набір елементів, у якій додавання нових елементів і видалення існуючих відбувається з одного кінця, який називається вершиною стека. Згідно визначення, елементи вилучаються зі стека в порядку, зворотному їхньому додаванню в цю структуру, тобто діє принцип LIFO (Last In, Fist Out – останнім прийшов, першим вийшов). Уявимо собі стопку тарілок. Нижня тарелка із цієї стопки буде використана останньою, а верхня тарілка, яка була покладена в стопку останньою, буде використана першою.
Стеки широко використовуються в системному програмному забезпеченні, включаючи компілятори і інтерпретатори.
Найбільш наочним прикладом організації стека служить дитяча пірамідка, де додавання й зняття кілець здійснюється саме відповідно до визначення стека.
Історично склалося так, що дві основні операції для стека - помістити в стек і вилучити зі стека - одержали назву відповідно "заштовхнути" і "виштовхнути". Тому для реализации стека необхідно створити дві функції: "push" (заштовхнути), що поміщає елемент у вершину стека, і "pop" (виштовхнути), що вилучає з вершини стека значення. Необхідно також передбачити певну область у пам'яті, де фактично буде зберігатися стек. Для цього можна використати масив або можна виділити область пам'яті, використовуючи засіб динамічного розпреділення пам'яті.
Приклад 1:
Нехай задана послідовність: 7 , 5 , 9 , 2 . Непарні числа цієї послідовності додаються у стек, а кожне парне число вилучає зі стеку один елемент.
Нижче показана динаміка вмісту стека під час обробки заданої послідовності:
Оскільки стек - це важлива абстракція даних, у стандартній бібліотеці С++ передбачений клас stack, для використання якого потрібно включити заголовочний файл:
#include <stack>
Повний набір стандартних операцій роботи зі стеком показаний у таблиці:
Операція |
Дія |
empty() |
Повертає true, якщо стек порожній, і false у противному випадку |
sіze() |
Повертає кількість елементів у стеку |
pop() |
Видаляє елемент із вершини стека, але не повертає його значення |
top() |
Повертає значення елемента з вершини стека, але не видаляє його |
push(іtem) |
Поміщає новий елемент у стек |
У наведеній програмі показані приклади використання цих операцій:
#include <stack>
#include <iostream>
int main()
{
const int ia_size = 10;
int ia[ia_size]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
// заповнення стеку
int ix = 0;
stack< int > intStack;
for ( ; ix < ia_size; ++ix )
intStack.push( ia[ ix ] );
int error_cnt = 0;
if ( intStack.size() != ia_size ) {
cerr << "Помилка! Неправильний розмір IntStack: "
// cerr - вихідний потік
<< intStack.size()
// повідомлень про помилки
<< "\t очікується: " << ia_size << endl,
++error_cnt;
}
int value;
while ( intStack.empty() == false )
{
// зчитування елемента з вершини стека
value = intStack.top();
if ( value != --ix ) {
cerr << " Помилка! очікується " << ix
<< " отримано " << value << endl;
++error_cnt;
}
// вилучення елемента
intStack.pop();
}
cout << "В результаті запуска програми отримано "
<< error_cnt << " помилок" << endl;
}
До двох стек одного типу можна застосовувати операції порівняння: рівність, нерівність, менше, більше, менше або дорівнює, більше або дорівнює, якщо вони визначені над елементами стека. Елементи порівнюються попарно. Перша пара неспівпадаючих елементів визначає результат операції порівняння вцілому.
Розглянемо статичну реалізацію стека на основі масиву з фіксованим рзміром. В наведенному далі лістінгу показано заголовочний файл для шаблонного класу stack, аналогічний класу stack зі стандартної бібліотеки шаблонів STL.
// ФАЙЛ: stack1.h
// ЗАБЕЗПЕЧУВАНИЙ ШАБЛОННИЙ КЛАС: stack<Item>
//
// ШАБЛОННИЙ ПАРАМЕТР, ОПЕРАТОРИ ПЕРЕІМЕНОВАННЯ ТИПІВ
// ТА КОНСТАНТНІ ЧЛЕНИ класу stack<Item>
// Шаблонний параметр Item уявляє собою тип елементів,
// що зберігаються у стеку. Він визначається також як
// stack<Item>::value_type
// і може бути довільним вбудованим типомв мові С++ (int, char і т.д.),
// а також класом, в якому визначений конструктор по замовчуванню,
// конструктор копіювання і оператор присвоєння. Визначення типу
// stack<Item>::size_type відноситься до довільної змінної, в якій зберігається
// кількість елементів стека. В цій реалізації константа
// stack<Item>:: CAPACITY означає максимальну кількість елементів довільного
// стека (як тільки ця кількість буде досягнута, заштовхування
// елементів у стек припиняється).
//
// КОНСТРУКТОР ШАБЛОННОГО КЛАСУ stack<Item>:
// stack()
// Післяумова: стек ініціалізується порожнім.
//
// МОДИФІКУЮЧІ ФУНКЦІЇ-ЧЛЕНИ шаблонного класу stack<Item>:
// void push(const Item& entry)
// Передумова: size( ) < CAPACITY.
// Післяумова: в стек занесена нова копія елемента.
//
// void pop( )
// Передумова: size( ) > 0.
// Післяумова: вилучена вершина стека.
//
// КОНСТАНТНІ ФУНКЦІЇ-ЧЛЕНИ шаблонного класу stack<Item>:
// Item top( ) const
// Передумова: size( ) > 0.
// Післяумова: повертається вершина стека, однак стек при цьому
// не змінюється. Цим цей клас дещо відрізняється від стека,
// що описаний в стандартній бібліотеці шаблонів STL ( в якому
// функція top повертає посилання на елемент, що знаходиться у
// вершині стека).
//
// size_type size( ) const
// Післяумова: повертає загальну кількість елементів у стеку.
//
// bool empty( ) const
// Післяумова: повертає значення true, якщо стек порожній,
// и значення false, якщо це не так.
//
// СЕМАНТИКА ЗНАЧЕНЬ для шаблонного класу stack<Item>.
// До об'єктів класу stack<Item> можна застосувати операцію
// присвоєння і конструктор копіювання.
#ifndef MAIN_SAVITCH_STACK1_H
#define MAIN_SAVITCH_STACK1_H
#include <cstdlib> // Надає тип size_t.
namespace main_savitch_7A
{
template <class Item>
class stack
{
public:
// ОПЕРАТОРИ ПЕРЕТВОРЕННЯ ТИПІВ ТА КОНСТАНТНІ ЧЛЕНИ
typedef std::size_t size_type;
typedef Item value_type;
static const size_type CAPACITY = 30;
// КОНСТРУКТОР
stack( ) { used = 0; }
// МОДИФІКУЮЧІ ФУНКЦІЇ-ЧЛЕНИ
void push(const Item& entry);
void pop( );
// КОНСТАНТНІ ФУНКЦІЇ-ЧЛЕНИ
bool empty( ) const { return (used == 0); }
size_type size( ) const { return used; }
Item top( ) const;
private:
Item data[CAPACITY]; // Частково заповнений масив.
size_type used;
};
}
#include "stack1.template" // Директива включення реалізації.
#endif
Файл реалізації класу stack показаний в наступному лістінгє:
// ФАЙЛ: stack1.template
// РЕАЛІЗОВАНИЙ ШАБЛОННИЙ КЛАС stack<Item>:
// Цей файл входить до складу заголовочного і окремо не компілюється.
// Інваріант класу stack:
// 1. Кількість елементів у стеку зберігається у змінній-члені used.
// 2. Елементи стека знаходяться у частково заповненому масиві data. На дні стеку // знаходиться елемент data[0], далі - data[0] і так далі аж до вершини стека, // у якій розташований елемент data[used-1].
#include <cassert> // Надає макрос assert.
namespace main_savitch_7A
{
template <class Item>
const typename stack<Item>::size_type stack<Item>::CAPACITY;
template <class Item>
void stack<Item>::push(const Item& entry)
// ВИКОРИСТОВУВАНА БІБЛІОТЕКА: cassert
{
assert(size( ) < CAPACITY);
data[used] = entry;
++used;
}
template <class Item>
void stack<Item>::pop( )
// ВИКОРИСТОВУВАНА БІБЛІОТЕКА: cassert
{
assert(!empty( ));
--used;
}
template <class Item>
Item stack<Item>::top( ) const
// ВИКОРИСТОВУВАНА БІБЛІОТЕКА: cassert
{
assert(!empty( ));
return data[used-1];
}
}