Ця стаття містить , але походження тверджень у ній через практично повну відсутність . |
Стек (англ. stack — «стос, стіс») в інформатиці та програмуванні — різновид , структура даних, яка працює за принципом (дисципліною) «останнім прийшов — першим пішов» (LIFO, англ. last in, first out). Усі операції (наприклад, видалення елемента) в стеку можна проводити тільки з одним елементом, який міститься на верхівці стека та був уведений у стек останнім.
Стек можна уявити як стопку тарілок, з якої можна взяти верхню, і на яку можна покласти верхню тарілку. Інша назва стека — «магазин», за аналогією з принципом роботи магазина в автоматичній зброї.
Операції зі стеком
- push («заштовхнути елемент»): елемент додається в стек та розміщується в його верхівці. Розмір стека збільшується на одиницю. При перевищенні граничної величини розміру стека, відбувається переповнення стека (англ. stack overflow).
- pop («виштовхнути елемент»): повертає елемент з верхівки стека. При цьому він видаляється зі стека і його місце у верхівці стека займає наступний за ним відповідно до правила LIFO, а розмір стека зменшується на одиницю. При намаганні «виштовхнути» елемент зі вже пустого стека, відбувається ситуація «незаповненість» стека (англ. stack underflow).
Кожна з цих операцій зі стеком виконується за фіксований час O(1) і не залежить від розміру стека.
Додаткові операції (присутні не у всіх реалізаціях стека):
- isEmpty: перевірка наявності елементів у стеку; результат: істина (true), коли стек порожній.
- isFull: перевірка заповненості стека. Результат: істина, коли додавання нового елементу неможливе.
- clear: звільнити стек (видалити всі елементи).
- top: отримати верхній елемент (без виштовхування).
- size: отримати розмір (кількість елементів) стека.
- swap: поміняти два верхніх елементи місцями.
Організація в пам'яті комп'ютера
Стек можна організувати як масив або множину комірок у певній ділянці пам'яті комп'ютера з додатковим зберіганням ще й вказівника на верхівку стека. Заштовхування елемента в стек збільшує адресу вказівника, виштовхування елемента зменшує її. Таким чином, адреса вказівника завжди відповідає комірці масиву, в якій зараз міститься верхівка стека.
Багато процесорів ЕОМ мають спеціалізовані регістри, які використовуються як вказівники на верхівку стека, або використовують деякі з регістрів загального вжитку для цієї спеціальної функції в певних режимах адресації пам'яті.
Приклади застосування
Калькулятори ([en]), де запис виразів організовано в інверсній польській нотації, використовують стек для збереження даних обчислень. Прикладом використання стекової машини є програма UNIX dc.
Існують «стеко-орієнтовані» мови програмування (Forth, PostScript), які використовують стек як базову структуру даних при виконанні багатьох операцій (арифметичних, логічних, вводу-виводу тощо).
Стеко-орієнтованими є деякі з віртуальних машин, наприклад віртуальна машина Java.
Компілятори мов програмування можуть використовувати стек для передавання параметрів у процесі виклику підпрограм, процедур та функцій (іншим поширеним способом передавання є регістри). Спеціалізований стек використовується також для збереження адрес повернення з підпрограм.
Реалізація базових алгоритмів
На мовах програмування високого рівня, стек можна реалізувати за допомогою масиву та додаткової змінної. Для зберігання елементів стека резервується масив S[1..n] певного розміру та додаткова змінна top[S], яка буде зберігати індекс верхівки стека.
Операції push та pop тоді можна записати так (без перевірки на переповнення та «незаповненість»):
PUSH (S, x)
1 top[S] := top[S] + 1 // збільшення індексу на 1
2 S[top[S]] := x // запис нового елемента у верхівку стека
POP (S)
1 top[S] := top[S] - 1 // зменшення індексу на 1
2 return S[top[S] + 1] // повернення колишньої верхівки стека
Приклад реалізації стека на мові за допомогою масиву:
template <class T> class StackOnArray { private: int top; int size; T* arr; void resizeAndCopy() { T* valueArr = new T[size]; for (int i = 0; i < top; ++i) { valueArr[i] = arr[i]; } delete[] arr; arr = valueArr; } public: StackOnArray() { top = 0; size = 10; arr = new T[size]; } ~StackOnArray() { delete[] arr; } void push(T value) { if (top >= size) { size *= 2; resizeAndCopy(); } arr[top] = value; ++top; } public: T pop() { T result = T(); if (!isEmpty()) { --top; result = arr[top]; if (top <= size / 3) { size = size * 2 / 3; resizeAndCopy(); } } return result; } bool isEmpty() { return top == 0; } int getSize() { return size; } };
Див. також
- Forth, PostScript — поширені стекові мови програмування.
Література
- Дональд Кнут. Fundamental Algorithms // The Art of Computer Programming. — 3rd. — Massachusetts : Addison–Wesley, 1997. — Т. 1. — 650 с. — .(англ.)
- Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. Section 10.1: Стеки і черги. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya mistit perelik posilan ale pohodzhennya tverdzhen u nij zalishayetsya nezrozumilim cherez praktichno povnu vidsutnist vnutrishnotekstovih dzherel vinosok Bud laska dopomozhit polipshiti cyu stattyu peretvorivshi dzherela z pereliku posilan na dzherela vinoski u samomu teksti statti U Vikipediyi ye statti pro inshi znachennya cogo termina Stek znachennya Stek angl stack stos stis v informatici ta programuvanni riznovid struktura danih yaka pracyuye za principom disciplinoyu ostannim prijshov pershim pishov LIFO angl last in first out Usi operaciyi napriklad vidalennya elementa v steku mozhna provoditi tilki z odnim elementom yakij mistitsya na verhivci steka ta buv uvedenij u stek ostannim Stek mozhna uyaviti yak stopku tarilok z yakoyi mozhna vzyati verhnyu i na yaku mozhna poklasti verhnyu tarilku Insha nazva steka magazin za analogiyeyu z principom roboti magazina v avtomatichnij zbroyi Operaciyi zi stekomVikonannya operacij push ta pop Priklad vikonannya operacij zi stekom push zashtovhnuti element element dodayetsya v stek ta rozmishuyetsya v jogo verhivci Rozmir steka zbilshuyetsya na odinicyu Pri perevishenni granichnoyi velichini rozmiru steka vidbuvayetsya perepovnennya steka angl stack overflow pop vishtovhnuti element povertaye element z verhivki steka Pri comu vin vidalyayetsya zi steka i jogo misce u verhivci steka zajmaye nastupnij za nim vidpovidno do pravila LIFO a rozmir steka zmenshuyetsya na odinicyu Pri namaganni vishtovhnuti element zi vzhe pustogo steka vidbuvayetsya situaciya nezapovnenist steka angl stack underflow Kozhna z cih operacij zi stekom vikonuyetsya za fiksovanij chas O 1 i ne zalezhit vid rozmiru steka Dodatkovi operaciyi prisutni ne u vsih realizaciyah steka isEmpty perevirka nayavnosti elementiv u steku rezultat istina true koli stek porozhnij isFull perevirka zapovnenosti steka Rezultat istina koli dodavannya novogo elementu nemozhlive clear zvilniti stek vidaliti vsi elementi top otrimati verhnij element bez vishtovhuvannya size otrimati rozmir kilkist elementiv steka swap pominyati dva verhnih elementi miscyami Organizaciya v pam yati komp yuteraStek mozhna organizuvati yak masiv abo mnozhinu komirok u pevnij dilyanci pam yati komp yutera z dodatkovim zberigannyam she j vkazivnika na verhivku steka Zashtovhuvannya elementa v stek zbilshuye adresu vkazivnika vishtovhuvannya elementa zmenshuye yiyi Takim chinom adresa vkazivnika zavzhdi vidpovidaye komirci masivu v yakij zaraz mistitsya verhivka steka Bagato procesoriv EOM mayut specializovani registri yaki vikoristovuyutsya yak vkazivniki na verhivku steka abo vikoristovuyut deyaki z registriv zagalnogo vzhitku dlya ciyeyi specialnoyi funkciyi v pevnih rezhimah adresaciyi pam yati Prikladi zastosuvannyaKalkulyatori en de zapis viraziv organizovano v inversnij polskij notaciyi vikoristovuyut stek dlya zberezhennya danih obchislen Prikladom vikoristannya stekovoyi mashini ye programa UNIX dc Isnuyut steko oriyentovani movi programuvannya Forth PostScript yaki vikoristovuyut stek yak bazovu strukturu danih pri vikonanni bagatoh operacij arifmetichnih logichnih vvodu vivodu tosho Steko oriyentovanimi ye deyaki z virtualnih mashin napriklad virtualna mashina Java Kompilyatori mov programuvannya mozhut vikoristovuvati stek dlya peredavannya parametriv u procesi vikliku pidprogram procedur ta funkcij inshim poshirenim sposobom peredavannya ye registri Specializovanij stek vikoristovuyetsya takozh dlya zberezhennya adres povernennya z pidprogram Realizaciya bazovih algoritmivNa movah programuvannya visokogo rivnya stek mozhna realizuvati za dopomogoyu masivu ta dodatkovoyi zminnoyi Dlya zberigannya elementiv steka rezervuyetsya masiv S 1 n pevnogo rozmiru ta dodatkova zminna top S yaka bude zberigati indeks verhivki steka Operaciyi push ta pop todi mozhna zapisati tak bez perevirki na perepovnennya ta nezapovnenist b PUSH b S x 1 top S top S 1 zbilshennya indeksu na 1 2 S top S x zapis novogo elementa u verhivku steka b POP b S 1 top S top S 1 zmenshennya indeksu na 1 2 b return b S top S 1 povernennya kolishnoyi verhivki steka Priklad realizaciyi steka na movi C za dopomogoyu masivu template lt class T gt class StackOnArray private int top int size T arr void resizeAndCopy T valueArr new T size for int i 0 i lt top i valueArr i arr i delete arr arr valueArr public StackOnArray top 0 size 10 arr new T size StackOnArray delete arr void push T value if top gt size size 2 resizeAndCopy arr top value top public T pop T result T if isEmpty top result arr top if top lt size 3 size size 2 3 resizeAndCopy return result bool isEmpty return top 0 int getSize return size Div takozhForth PostScript poshireni stekovi movi programuvannya LiteraturaDonald Knut Fundamental Algorithms The Art of Computer Programming 3rd Massachusetts Addison Wesley 1997 T 1 650 s ISBN 0 201 89683 4 angl T Kormen Ch Lejzerson R Rivest K Stajn 2009 1990 Section 10 1 Steki i chergi Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4