stack data structure c with illustration
flvto не дозволив мені перетворити
Все, що вам потрібно знати про стек в C ++.
Стек - це основна структура даних, яка використовується для лінійного зберігання елементів.
Стек слід LIFO (останній вихід, перший вихід) порядок або підхід, при якому виконуються операції. Це означає, що елемент, який був доданий останнім до стеку, буде першим елементом, який буде видалено зі стека.
=> Завітайте сюди, щоб побачити цілу серію навчальних програм C ++ для всіх.
Що ви дізнаєтесь:
Стек у C ++
Стек схожий на стек з реального життя або купу речей, які ми складаємо одна над одною.
Нижче наведено графічне зображення Stack.
Як показано вище, є купа тарілок, складених одна на одну. Якщо ми хочемо додати до нього інший елемент, тоді ми додаємо його у верхній частині стека, як показано на малюнку вище (зліва). Ця операція додавання елемента в стек називається “ Натисніть '.
На правій стороні ми показали протилежну операцію, тобто ми видаляємо елемент зі стека. Це також робиться з того самого кінця, тобто верхньої частини стека. Ця операція називається “ Поп '.
Як показано на малюнку вище, ми бачимо, що натискання та поштовх здійснюються з одного кінця. Це робить стек слідувати порядку LIFO. Позиція або кінець, з якого предмети штовхаються або вискакують у / зі стопки, називається “ Верх стека '.
Спочатку, коли в стосі немає елементів, верхня частина стека встановлюється на -1. Коли ми додаємо елемент у стек, верх стека збільшується на 1, що вказує на те, що елемент додано. На противагу цьому, вершина стека зменшується на 1, коли предмет вискакує з стека.
Далі ми побачимо деякі основні операції зі структурою даних стека, які нам знадобляться під час реалізації стека.
Основні операції
Нижче наведені основні операції, які підтримуються стеком.
- натиснути - Додає або штовхає елемент у стек.
- поп - Видаляє або вискакує елемент зі стопки.
- заглянути - Отримує верхній елемент стека, але не видаляє його.
- isFull - Перевіряє, чи стек заповнений.
- пусто - Перевіряє, чи стек порожній.
Ілюстрація
Наведена вище ілюстрація показує послідовність операцій, які виконуються над стеком. Спочатку стек порожній. Для порожнього стека для вершини стека встановлено значення -1.
Далі ми штовхаємо елемент 10 в стопку. Ми бачимо, що верх стека тепер вказує на елемент 10.
Далі ми виконуємо ще одну операцію поштовху з елементом 20, в результаті чого верх стека тепер вказує на 20. Цей стан є третьою фігурою.
Тепер на останньому малюнку ми виконуємо операцію pop (). В результаті операції вискочування елемент, спрямований у верхній частині стека, вилучається зі стопки. Отже, на малюнку ми бачимо, що елемент 20 видалений зі стопки. Таким чином, вершина стека тепер вказує на 10.
Таким чином, ми можемо легко розібрати підхід LIFO, який використовує стек.
Впровадження
# 1) Використання масивів
Нижче наведена реалізація стеку за допомогою масивів на C ++:
#include using namespace std; #define MAX 1000 //max size for stack class Stack { int top; public: int myStack[MAX]; //stack array Stack() { top = -1; } bool push(int x); int pop(); bool isEmpty(); }; //pushes element on to the stack bool Stack::push(int item) { if (top >= (MAX-1)) { cout << 'Stack Overflow!!!'; return false; } else { myStack[++top] = item; cout< Вихід:
Натискання стека
два
4
6
Стек поп:
6
4
два
На виході ми бачимо, що елементи вкладаються в стек в одному порядку і висуваються з стеку в зворотному порядку. Це демонструє підхід LIFO (Last in, First out) для стека.
Для вищезазначеної реалізації стеку масиву ми можемо зробити висновок, що це дуже легко реалізувати, оскільки тут не задіяні вказівники. Але в той же час розмір стека є статичним, і стек не може динамічно зростати або зменшуватися.
Далі ми реалізуємо стек за допомогою масивів на мові програмування Java.
class Stack { static final int MAX = 1000; // Maximum Stack size int top; int myStack[] = new int[MAX]; boolean isEmpty() { return (top = (MAX-1)) { System.out.println('Stack Overflow'); return false; } else { myStack[++top] = item; System.out.println(item); return true; } } int pop() { if (top <0) { System.out.println('Stack Underflow'); return 0; } else { int item = myStack[top--]; return item; } } } //Main class code class Main { public static void main(String args[]) { Stack stack = new Stack(); System.out.println('Stack Push:'); stack.push(1); stack.push(3); stack.push(5); System.out.println('Stack Pop:'); while(!stack.isEmpty()) { System.out.println(stack.pop()); } } }
Вихід:
Натискання стека:
один
3
5
Стек поп:
5
3
один
Логіка реалізації така ж, як і в реалізації С ++. Вихідні дані демонструють техніку LIFO для проштовхування та вискакування елементів у / з стеку.
Як уже зазначалося, реалізація стека за допомогою масивів є найпростішою реалізацією, але вона має статичний характер, оскільки ми не можемо динамічно збільшувати або зменшувати стек.
# 2) Використання пов’язаного списку
Далі ми реалізуємо операції зі стеком, використовуючи пов’язаний список як на C ++, так і на Java. Спочатку ми продемонструємо реалізацію С ++.
#include using namespace std; // class to represent a stack node class StackNode { public: int data; StackNode* next; }; StackNode* newNode(int data) { StackNode* stackNode = new StackNode(); stackNode->data = data; stackNode->next = NULL; return stackNode; } int isEmpty(StackNode *root) { return !root; } void push(StackNode** root, int new_data){ StackNode* stackNode = newNode(new_data); stackNode->next = *root; *root = stackNode; cout<data; free(temp); return popped; } int peek(StackNode* root) { if (isEmpty(root)) return -1; return root->data; } int main() { StackNode* root = NULL; cout<<'Stack Push:'< Вихід:
Натискання стека:
100
200
300
Верхній елемент - 300
Стек поп:
програмне забезпечення для злому паролів безкоштовно завантажити повну версію -
300
200
100
Верхній елемент - -1
Далі ми представляємо реалізацію стека Java за допомогою пов’язаного списку.
class LinkedListStack { StackNode root; static class StackNode { int data; StackNode next; StackNode(int data) { this.data = data; } } public boolean isEmpty() { if (root == null) { return true; } else return false; } public void push(int new_data) { StackNode newNode = new StackNode(new_data); if (root == null) { root = newNode; } else { StackNode temp = root; root = newNode; newNode.next = temp; } System.out.println(new_data); } public int pop() { int popped = Integer.MIN_VALUE; if (root == null) { System.out.println('Stack is Empty'); } else { popped = root.data; root = root.next; } return popped; } public int peek() { if (root == null) { System.out.println('Stack is empty'); return Integer.MIN_VALUE; } else { return root.data; } } } class Main{ public static void main(String[] args) { LinkedListStack stack = new LinkedListStack(); System.out.println('Stack Push:'); stack.push(100); stack.push(200); stack.push(300); System.out.println('Top element is ' + stack.peek()); System.out.println('Stack Pop:'); while(!stack.isEmpty()){ System.out.println(stack.pop()); } System.out.println('Top element is ' + stack.peek()); } }
Вихід:
Натискання стека:
100
200
300
Верхній елемент - 300
Стек поп:
300
200
100
Стек порожній
Верхній елемент -2147483648
Ми щойно бачили реалізації C ++ та Java для стека з використанням пов'язаних списків. Ми представляємо кожен запис стека як вузол пов'язаного списку. Найважливіша перевага цієї реалізації полягає в її динамічності. Це означає, що ми можемо збільшити або зменшити розмір стека відповідно до наших вимог.
Це на відміну від випадку реалізації стека з використанням масивів, в яких ми повинні заздалегідь оголосити розмір і не можемо його динамічно змінювати.
Недолік цієї реалізації полягає в тому, що, оскільки ми використовуємо вказівники скрізь, це займає трохи занадто багато місця в порівнянні з реалізацією масиву.
Застосування Stack
Давайте обговоримо деякі застосування структури даних стеку. Структура даних стеку використовується в ряді застосувань при програмуванні програмного забезпечення, головним чином, завдяки простоті та простоті реалізації.
Нижче ми коротко опишемо деякі програми стека:
# 1) Infix To Postfix вирази
Будь-який загальний арифметичний вираз має форму операнд1 ОП операнд 2 .
Виходячи з позиції оператора OP, ми маємо такі типи виразів:
- Інфікс - Загальна форма вираження інфіксу: операнд1 ОП операнд 2 '. Це основна форма виразу, і ми постійно використовуємо її в математиці.
- Префікс - Коли оператор розміщується перед операндами, це вираз префікса. Загальна форма вираження інфіксу: Операнд OP1 операнд2 '.
- Постфікс - У виразах постфіксу спочатку пишуться операнди, а потім оператор. Він має вигляд “операнд1 операнд2 OP”.
Розглянемо вираз „a + b * c ' . Компілятор сканує вираз або зліва направо, або справа наліво. Подбавши про пріоритет оператора та асоціативність, він спочатку сканує вираз, щоб оцінити вираз b * c. Далі йому знову доведеться відсканувати вираз, щоб додати результат b * c до a.
У міру того, як вирази стають дедалі складнішими, такий підхід повторного і повторного сканування виразу стає неефективним.
Для подолання цієї неефективності ми перетворюємо вираз у постфікс або префікс, щоб їх можна було легко оцінити за допомогою структури даних стека.
# 2) Синтаксичний аналіз / оцінка виразів
Використовуючи стек, ми можемо також здійснити фактичну оцінку виразу. При цьому вираз сканується зліва направо, а операнди пересуваються в стек.
Щоразу, коли зустрічається оператор, операнди вискакуються і операція виконується. Результат операції знову засовується в стек. Таким чином, коли вираз обчислюється за допомогою стека, а кінцевий результат виразу, як правило, є поточною вершиною стека.
# 3) Обхід дерев
Деревову структуру даних можна здійснити, щоб відвідувати кожен вузол різними способами та залежно від того, коли відвіданий корінний вузол, який ми маємо.
- обхід inOrder
- попереднє замовлення обходу
- обхід postOrder
Для ефективного обходу дерева ми використовуємо структуру даних стека, щоб проштовхувати проміжні вузли в стеку, щоб підтримувати порядок обходу.
# 4) Алгоритми сортування
Алгоритми сортування, такі як швидке сортування, можна зробити більш ефективними, використовуючи структури даних стеку.
# 5) Вежі Ханоя
Це класична проблема, що включає n кількість дисків і три вежі, і проблема полягає в переміщенні дисків з однієї вежі на іншу, а третя вежа використовується як проміжна.
Цю проблему можна ефективно вирішити за допомогою стека, коли ми натискаємо диски, які потрібно перенести в стек, оскільки стек в основному діє як башта, що використовується для переміщення дисків.
Висновок
Стек - це найпростіша структура даних і простіша у реалізації як програма. Він використовував підхід LIFO (останній вхід, перший вихід), що означає, що елемент, введений останнім, є тим, який видаляється першим. Це пов’язано з тим, що стек використовує лише один кінець для додавання (натискання) та видалення (виведення) елементів.
Структура даних стека має багато застосувань при програмуванні програмного забезпечення. Найвидатнішим серед них є оцінка висловлювань. Оцінка виразу також включає перетворення виразу з інфіксу в постфікс або префікс. Це також передбачає оцінку виразу для отримання кінцевого результату.
У цьому підручнику ми побачили ілюстрацію та реалізацію стека, а також різні його операції.
У нашому майбутньому підручнику ми детально дізнаємося про структуру даних черги.
=> Завітайте сюди, щоб отримати повний курс експертів на C ++.
Рекомендована література
- Структура даних черги в C ++ з ілюстрацією
- Структура даних кругового зв’язаного списку на C ++ з ілюстрацією
- Структура даних зв’язаного списку на C ++ з ілюстрацією
- Структура даних черги пріоритетів у C ++ з ілюстрацією
- Подвійно пов’язана структура даних списку на C ++ з ілюстрацією
- Вступ до структур даних на C ++
- Параметризація даних JMeter за допомогою користувацьких змінних
- 10+ найкращих інструментів збору даних із стратегіями збору даних