Концепція стека
Стек є корисною структурою даних у програмуванні. Це як стос тарілок, що лежать один на одному.
Подумайте про те, що ви можете зробити з такою купою тарілок:
- Покласти нову тарілку зверху;
- Перемістити верхню тарілку.
Якщо ви бажаєте, щоб тарілка була внизу, необхідно прибрати всі верхні тарілки. Така домовленість називається Last In First Out або LIFO (останній увійшов, перший вийшов) - останній елемент, який був розміщений, є першим елементом, який вийде.
Стек в умовах програмування
З погляду програмування, розміщення елемента поверх стека називається "push", а видалення елемента - "pop". Останній доданий елемент називається верхівкою стека, або top.
На зображенні видно, що елемент 2 був збережений останнім, але видаляється першим, тому що підкоряється роботі принципу LIFO (останній увійшов, вийшов перший).
Ми можемо реалізувати стек будь-якою мовою програмування, такою як C, C++, Java, Python або C#, майже з однаковою специфікацією.
Специфікація стека
Стек - це об'єкт або, конкретніше, абстрактна структура даних (ADT), яка дозволяє виконувати наступні операції:
- Push: додати елемент на початок стека;
- Pop: видалити елемент із верхньої частини стека;
- IsEmpty: перевірити, чи порожній стек;
- IsFull: перевірте, чи заповнений стек;
- Peek: отримати значення верхнього елемента, не видаляючи його.
Як працює стек
Операції працюють таким чином:
- Вказівник TOP називається для відстеження верхнього елемента у стеку.
- При ініціалізації стека ми встановлюємо його значення -1, щоб ми могли перевірити, чи стек є порожнім, порівнюючи TOP == -1.
- Натиснувши на елемент, ми збільшуємо значення TOP і поміщаємо новий елемент у положення, яке вказує TOP.
- При отриманні елемента ми повертаємо елемент, який вказує TOP, і зменшуємо його значення.
- Перед додаванням елемента ми перевіряємо, чи заповнений стек.
- Перед подовженням елемента ми перевіряємо, чи стек пустий.
Реалізація стека мовою програмування
Найбільш поширена реалізація стека використовує масиви, але можлива реалізація з використанням списків.
Ось реалізація, що використовує масиви С.
#include<stdio.h> #include<conio.h> #include<stdlib.h> #define MAX 10 struct stack { int items[MAX]; int top; }; typedef struct stack st; void createEmptyStack(st *s) { s->top=-1; } int isfull(st *s) { if (s->top==MAX-1) return 1; else return 0; } int isempty(st *s) { if (s->top==-1) return 1; else return 0; } void push(st *s) { int newitem; printf("Enter item to be inserted: "); scanf("%d",&newitem); if (isfull(s)) { printf("STACK FULL"); } else { s->top++; s->items[s->top]=newitem; } } void pop (st *s) { if (isempty(s)) { printf("\n STACK EMPTY \n"); } else { printf("Item popped= %d",s->items[s->top]); s->top--; } } void main() { int ch; int loop; loop=1; st *s; createEmptyStack(s); do { printf("\n ***STACK OPERATIONS"); printf("\n 1. PUSH"); printf("\n 2. POP"); printf("\n 3. EXIT"); printf("\n ***************"); printf("\n Enter your choice: "); scanf("%d", &ch); switch (ch) { case 1: push(s); break; case 2: pop(s); break; case 3: printf("THANK YOU"); loop=0; exit(0); default: printf("Invalid choice"); } } while(loop); getch(); }
Використання стека
Хоча стек є простою для реалізації структуру даних, він є дуже корисним. Найбільш поширені області використання стека для виконання наступних завдань:
- Щоб перевернути слово - складіть всі літери в стос і витягніть їх. Через порядок стека LIFO, ви отримаєте літери у зворотному порядку.
- У компіляторах - компілятори використовують стек для обчислення значення виразів, таких як 2 + 4/5 * (7-9), шляхом перетворення виразу в префіксну або постфіксну форму.
- У браузерах – кнопка «Назад» у браузері зберігає всі URL-адреси, які ви відвідали раніше у стеку. Щоразу, коли ви відвідуєте нову сторінку, вона додається на початок стеку. Коли ви натискаєте кнопку «Назад», поточна URL-адреса видаляється зі стека і відкривається попередня URL-адреса.