stack data structure c with illustration
басх упоређује датотеке ред по ред
Све што треба да знате о стеку у Ц ++-у.
Стек је основна структура података која се користи за линеарно складиштење елемената.
След следи ЛИФО (последњи улаз, први излаз) редослед или приступ у коме се изводе операције. То значи да ће елемент који је последњи додан у стек бити први елемент који се уклања из стека.
=> Посетите овде да бисте видели целу серију обука за Ц ++ за све.
Шта ћете научити:
Стацк ин Ц ++
Стог је сличан стогу из стварног живота или гомили ствари које слажемо једну изнад друге.
Доље је дат сликовни приказ Стацка.
Као што је приказано горе, постоји гомила плоча наслаганих једна на другу. Ако желимо да му додамо још једну ставку, тада је додајемо на врх стога, као што је приказано на горњој слици (лева страна). Ова операција додавања ставке у стог назива се „ Притисни ”.
На десној страни показали смо супротну операцију, тј. Уклањамо ставку из стека. То се такође ради са истог краја, тј. Врха стека. Ова операција се назива „ Поп ”.
Као што је приказано на горњој слици, видимо да се гурање и искакање изводи са истог краја. Ово чини да стек прати ЛИФО ред. Положај или крај с којег се предмети убацују или искачу у / из гомиле назива се „ Врх стека ”.
У почетку, када у хрпи нема предмета, врх стека је постављен на -1. Када ставку додамо ставку, врх стека се увећава за 1 што значи да је ставка додата. Насупрот овоме, врх стека се смањује за 1 када се предмет искочи из стека.
Даље, видећемо неке од основних операција структуре података стека које ће нам бити потребне током примене стека.
Основне операције
Следе основне операције које подржавају стек.
- пусх - Додаје или гура елемент у стек.
- поп - Уклања или искаче елемент из стека.
- завирити - Добија горњи елемент стека, али га не уклања.
- је пун - Тестира да ли је стог пун.
- Празно - Тестира да ли је стек празан.
Илустрација
Горња илустрација приказује редослед операција које се изводе на стеку. У почетку је стек празан. За празан стек, врх стека је постављен на -1.
Даље, гурнемо елемент 10 у стек. Видимо да врх стека сада показује на елемент 10.
Даље, изводимо још једну операцију потискивања са елементом 20, услед чега врх стека сада показује на 20. Ово стање је трећа фигура.
Сада на последњој слици изводимо поп () операцију. Као резултат искачуће акције, елемент усмерен на врх стека уклања се из стека. Отуда на слици видимо да је елемент 20 уклоњен из гомиле. Тако врх стека сада показује на 10.
На тај начин лако можемо разазнати ЛИФО приступ који користи стек.
Имплементација
# 1) Коришћење низова
Следи Ц ++ имплементација стека помоћу низова:
#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
два
У излазу можемо видети да се елементи гурају у стек једним редом и искачу из стека обрнутим редоследом. Ово показује ЛИФО (Ласт ин, Фирст оут) приступ за стек.
За горњу примену низа низа, можемо закључити да је ово врло лако имплементирати јер нису укључени показивачи. Али у исто време, величина стека је статична и стек не може динамички да расте или да се смањује.
Даље ћемо имплементирати стек користећи низове у програмском језику Јава.
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()); } } }
Излаз:
Стацк пусх:
1
3
5
Стацк Поп:
5
3
1
Логика имплементације је иста као у примени Ц ++. Излаз приказује ЛИФО технику гурања и искакања елемената у / из стека.
Као што је већ речено, имплементација стека помоћу низова је најједноставнија имплементација, али је статичке природе, јер не можемо динамички расти или смањивати стек.
# 2) Коришћење повезане листе
Даље, имплементирамо операције стека користећи повезану листу и на Ц ++ и на Јави. Прво ћемо показати имплементацију Ц ++.
#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
Даље, представљамо Јава имплементацију стека помоћу повезане листе.
цхар на цео број ц ++
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
Управо смо видели примене Ц ++ и Јаве за стек користећи повезане листе. Сваки унос стека представљамо као чвор повезане листе. Најважнија предност ове имплементације је што је динамична. То значи да можемо повећати или смањити величину слога према нашим захтевима.
Ово је за разлику од случаја примене стека који користи низове у којима морамо претходно декларисати величину и не можемо је динамички променити.
Мане за ову имплементацију су у томе што како свуда користимо показиваче, заузима мало превише простора у поређењу са имплементацијом низа.
Примене Стацка
Размотримо неке од примена структуре података стека. Структура података стека користи се у читавом низу апликација у софтверском програмирању, углавном због своје једноставности и лакоће примене.
У наставку ћемо укратко описати неке од примена стека:
# 1) Инфикс у постфиксне изразе
Било који општи аритметички израз је облика операнд1 ОП операнд 2 .
На основу положаја оператора ОП имамо следеће типове израза:
- Инфик - Општи облик израза инфикса је „ операнд1 ОП операнд 2 ”. Ово је основни облик израза и све време га користимо у математици.
- Префикс - Када је оператор постављен испред операнда, то је израз префикса. Општи облик израза инфикса је „ ОП операнд1 операнд2 ”.
- Постфик - У постфиксним изразима прво се пишу операнди, а затим оператор. Има облик „операнд1 операнд2 ОП“.
Размотрите израз „а + б * ц ' . Компајлер скенира израз с лева на десно или с десна на лево. Водећи рачуна о првенству и асоцијативности оператора, прво ће скенирати израз да би проценио израз б * ц. Даље, мораће поново да скенира израз да би резултат б * ц додао у а.
Како изрази постају све сложенији, овакав приступ непрестаног скенирања израза постаје неефикасан.
Да бисмо превазишли ову неефикасност, израз претварамо у постфикс или префикс тако да се лако могу проценити помоћу структуре података стека.
# 2) Рашчлањивање / процена израза
Користећи стек, такође можемо извршити стварну процену израза. У томе се израз скенира слева удесно, а операнди се гурају у стек.
Кад год се сусретне оператор, искачу се операнди и операција се изводи. Резултат операције се поново гура у стог. На овај начин се израз процењује помоћу стека, а коначни резултат израза је обично тренутни врх стека.
# 3) Прелазак дрвета
Структура података стабла може се обићи да би се посетио сваки чвор на много начина и у зависности од тога када је посећен основни чвор који имамо.
- преокрет инОрдер
- преордер Прелазак
- прелазак постОрдер
Да бисмо ефикасно прешли стабло, користимо структуру података стека како бисмо потиснули средње чворове на стеку тако да одржавамо редослед преласка.
# 4) Алгоритми за сортирање
Алгоритми за сортирање попут брзог сортирања могу се учинити ефикаснијим користећи структуре података стека.
# 5) Куле Ханоја
Ово је класичан проблем који укључује н број дискова и три куле, а проблем укључује премештање дискова са једног на други торањ, при чему се трећи торањ користи као средњи.
Овај проблем се може ефикасно решити помоћу стека док гурамо дискове који се премештају у стек, јер стек у основи делује као торањ који се користи за померање дискова.
Закључак
Склоп је најједноставнија структура података и лакша за примену као програм. Користио је приступ ЛИФО (задњи улаз, први излаз), што значи да је елемент који је последњи унесен онај који се први уклања. То је зато што стек користи само један крај за додавање (гурање) и уклањање (искакање) елемената.
Структура података стека има много примена у програмирању софтвера. Међу њима је истакнута оцена изражавања. Процена израза такође укључује претварање израза из инфикса у постфикс или префикс. Такође укључује процену израза да би се добио коначни резултат.
У овом упутству видели смо илустрацију и примену стека као и његове различите операције.
У нашем предстојећем упутству детаљно ћемо научити о структури података о реду.
=> Посетите овде за комплетан курс за стручњаке на Ц ++.
Препоручено читање
- Структура података у реду у Ц ++ са илустрацијом
- Структура података кружно повезане листе на Ц ++ са илустрацијом
- Повезана структура података листе на Ц ++ са илустрацијом
- Структура података приоритетног реда у Ц ++ са илустрацијом
- Структура података двоструко повезане листе у Ц ++ са илустрацијом
- Увод у структуре података на језику Ц ++
- ЈМетер параметризација података коришћењем кориснички дефинисаних променљивих
- 10+ најбољих алата за прикупљање података са стратегијама прикупљања података