Diferență între revizuiri ale paginii „SDA Lucrarea 4”
(Nu s-au afișat 62 de versiuni intermediare efectuate de același utilizator) | |||
Linia 1: | Linia 1: | ||
− | În acest laborator se vor | + | În acest laborator se vor utiliza stive și cozi din STL pentru rezolvarea de probleme. |
= Coada = | = Coada = | ||
Coada este o structură de date de tip FIFO (First In First Out), care stochează o colecție de elemente în ordinea în care au fost adăugate. | Coada este o structură de date de tip FIFO (First In First Out), care stochează o colecție de elemente în ordinea în care au fost adăugate. | ||
+ | |||
+ | [[Fișier:queue.png]] | ||
Coada are următoarele proprietăți: | Coada are următoarele proprietăți: | ||
Linia 11: | Linia 13: | ||
# Elementele pot fi adăugate doar la unul din capete și extrase doar de la celălalt - primul element inserat este primul care este extras. | # Elementele pot fi adăugate doar la unul din capete și extrase doar de la celălalt - primul element inserat este primul care este extras. | ||
− | + | Coada suportă următoarele operații de bază: | |
# Interogarea numărului de elemente din coadă. | # Interogarea numărului de elemente din coadă. | ||
# Verificarea dacă coada este goală. | # Verificarea dacă coada este goală. | ||
Linia 19: | Linia 21: | ||
# Vizualizarea unui element din coadă fără extragerea acestuia (''peek''). | # Vizualizarea unui element din coadă fără extragerea acestuia (''peek''). | ||
− | == Implementarea cozii | + | == Implementarea cozii == |
− | + | Deoarece coada este o particularizare a unei secvențe în care doar o parte din operații sunt expuse utilizatorului, toate implementările de secvențe pot fi utilizate pentru implementări de cozi. Totuși, deoarece STL este implementat pentru eficiență maximă, doar structurile care oferă operații în timp minim sunt expuse pentru utilizarea în cozi: [http://en.cppreference.com/w/cpp/container/list std:list] și [http://en.cppreference.com/w/cpp/container/deque std::deque]. Un deque (Double-Ended Queue) este o structură de date care permite inserția și eliminarea de elemente din ambele capete în timp constant. | |
− | + | Clasa care implementeaza cozi în STL este [http://en.cppreference.com/w/cpp/container/queue std::queue], este definită în header-ul <code>queue</code> și folosește implicit un <code>std::deque</code> pentru stocarea datelor: | |
− | |||
− | |||
− | |||
− | |||
− | # | + | <syntaxhighlight lang="cpp"> |
+ | #include <queue> | ||
+ | #include <cstdio> | ||
− | + | int main() { | |
− | + | std::queue<int> myQueue; | |
− | + | myQueue.push(10); | |
− | + | myQueue.push(11); | |
− | + | myQueue.push(12); | |
− | } | + | printf("Stack head is: %d\n", myQueue.front()); |
+ | return 0; | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Dacă doriți să utilizați o listă dublu înlănțuită pentru implementarea de cozi, sintaxa este următoarea: | |
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <queue> | ||
+ | #include <list> | ||
+ | #include <cstdio> | ||
− | + | int main() { | |
+ | std::queue<int, std::list<int>> myListQueue; | ||
+ | myListQueue.push(10); | ||
+ | myListQueue.push(11); | ||
+ | myListQueue.push(12); | ||
+ | printf("Stack head of my list implemnted queue is: %d\n", myListQueue.front()); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
− | + | == Crearea unui <code>std::queue</code> == | |
− | <syntaxhighlight lang=" | + | Pentru crearea unei cozi noi, se definește următorul constructor: |
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
/** | /** | ||
− | * | + | * Constructorul alocă memorie și creeaza un un nou std::queue. |
− | |||
− | |||
− | |||
*/ | */ | ||
− | + | queue(); | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Exemplu: | |
− | + | ||
− | # | + | <syntaxhighlight lang="C"> |
− | # | + | #include <queue> |
− | + | #include <cstdio> | |
− | + | ||
+ | using std::queue; | ||
+ | |||
+ | int main() { | ||
+ | queue<float> myQueue; | ||
+ | myQueue.push(0.1); | ||
+ | printf("Queue is empty: %d\n", myQueue.empty()); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
== Interogarea dimensiunii == | == Interogarea dimensiunii == | ||
Linia 66: | Linia 89: | ||
Pentru interogarea dimensiunii, se definește următoarea funcție: | Pentru interogarea dimensiunii, se definește următoarea funcție: | ||
− | <syntaxhighlight lang=" | + | <syntaxhighlight lang="cpp"> |
+ | /** | ||
+ | * Metoda intoarce numarul de elemente din coada. | ||
+ | * @return numarul de elemente din coada. | ||
+ | */ | ||
+ | uint32_t size(); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Exemplu: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <queue> | ||
+ | #include <cstdio> | ||
+ | |||
+ | int main() { | ||
+ | std::queue<char> charQueue; | ||
+ | charQueue.push('a'); | ||
+ | charQueue.push('b'); | ||
+ | charQueue.push('c'); | ||
+ | printf("The queue has %u elements!\n", charQueue.size()); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Adăugarea unui element - push == | ||
+ | |||
+ | Pentru adăugarea unui element '''value''' în coadă, se definește următoarea funcție: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | /** | ||
+ | * Metoda inserează elementul value în coadă. | ||
+ | * @param value elementul ce trebuie adăugat. | ||
+ | */ | ||
+ | void push(T value); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Exemplu: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <queue> | ||
+ | #include <cstdio> | ||
+ | |||
+ | int main() { | ||
+ | std::queue<char> charQueue; | ||
+ | charQueue.push('a'); | ||
+ | charQueue.push('b'); | ||
+ | charQueue.push('c'); | ||
+ | printf("The queue has %u elements!\n", charQueue.size()); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Eliminarea elementului din vârful cozii - pop == | ||
+ | |||
+ | Pentru extragerea unui element din coadă, se definește următoarea metodă: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | /** | ||
+ | * Metoda elimina următorul element din coadă. | ||
+ | */ | ||
+ | void pop(); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Exemplu: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <queue> | ||
+ | #include <cstdio> | ||
+ | |||
+ | int main() { | ||
+ | std::queue<char> charQueue; | ||
+ | charQueue.push('a'); | ||
+ | charQueue.push('b'); | ||
+ | charQueue.push('c'); | ||
+ | |||
+ | printf("Next char is: %c\n", charQueue.front()); | ||
+ | charQueue.pop(); | ||
+ | printf("Next char is: %c\n", charQueue.front()); | ||
+ | charQueue.pop(); | ||
+ | printf("Next char is: %c\n", charQueue.front()); | ||
+ | charQueue.pop(); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Vizualizarea primului element din coadă - front == | ||
+ | |||
+ | Pentru vizualizarea primului element din coadă, fără a-l extrage, se definește următoarea metodă: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
/** | /** | ||
− | * | + | * Metoda întoarce următorul element din coadă, fără a-l extrage. |
− | + | * @return următorul element din coadă | |
− | * @return | ||
*/ | */ | ||
− | + | T front(); | |
+ | </syntaxhighlight> | ||
+ | |||
+ | Exemplu: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <queue> | ||
+ | #include <cstdio> | ||
+ | |||
+ | int main() { | ||
+ | std::queue<char> charQueue; | ||
+ | charQueue.push('a'); | ||
+ | charQueue.push('b'); | ||
+ | charQueue.push('c'); | ||
+ | |||
+ | printf("Next char is: %c\n", charQueue.front()); | ||
+ | charQueue.pop(); | ||
+ | printf("Next char is: %c\n", charQueue.front()); | ||
+ | charQueue.pop(); | ||
+ | printf("Next char is: %c\n", charQueue.front()); | ||
+ | charQueue.pop(); | ||
+ | return 0; | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | = Stiva = | |
+ | |||
+ | Stiva este o structură de date de tip LIFO (Last In First Out), care stochează o colecție de elemente în ordinea în care au fost adăugate. | ||
+ | |||
+ | [[Fișier:stack.png]] | ||
− | + | Stiva are următoarele proprietăți: | |
+ | # Datele sunt stocate într-o anumită ordine (se poate spune că un element este plasat înaintea sau după un alt element în structură). | ||
+ | # Numărul de elemente ce poate fi stocat de structură este nelimitat sau limitat, în funcție de implementare. | ||
+ | # Elementele stocate în stivă sunt de același fel. | ||
+ | # Elementele pot fi adăugate sau extrase doar dintr-un capăt - ultimul element inserat este primul care este extras. | ||
− | <syntaxhighlight lang=" | + | Stiva suportă următoarele operații de bază: |
+ | # Interogarea numărului de elemente din stivă. | ||
+ | # Verificarea dacă stiva este goală. | ||
+ | # Verificarea dacă stiva este plină (pentru stive limitate). | ||
+ | # Adăugarea unui element în stivă (''push''). | ||
+ | # Extragerea unui element din stivă (''pop''). | ||
+ | # Vizualizarea unui element din stivă fără extragerea acestuia (''peek''). | ||
+ | |||
+ | == Implementarea stivei == | ||
+ | |||
+ | În STL, clasa care implementează stiva este [http://en.cppreference.com/w/cpp/container/stack std::stack]. Ca și coada, această clasă se folosește de o implementare concretă de secvență care poate face operațiile necesare stivei în timp constant. Clasele posibile pentru salvarea datelor unei stive sunt [http://en.cppreference.com/w/cpp/container/vector std::vector], [http://en.cppreference.com/w/cpp/container/list std::list] și [http://en.cppreference.com/w/cpp/container/deque std::deque]. Implicit clasa folosită este <code>std::deque</code>. | ||
+ | |||
+ | == Crearea unui obiect de tip <code>std::stack</code> == | ||
+ | |||
+ | Pentru crearea unei stive noi, se definește următorul constructor: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
/** | /** | ||
− | * | + | * Constructorul alocă memorie și creeaza o noua stiva. |
− | |||
− | |||
*/ | */ | ||
− | + | stack(); | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Exemplu: | |
+ | |||
+ | <syntaxhighlight lang="cpp" highlight="6"> | ||
+ | #include <stack> | ||
+ | #include <cstdio> | ||
+ | using std::stack; | ||
− | Pentru | + | int main() { |
+ | stack<char> word; | ||
+ | word.push('c'); | ||
+ | word.push('a'); | ||
+ | word.push('s'); | ||
+ | word.push('t'); | ||
+ | word.push('r'); | ||
+ | word.push('a'); | ||
+ | word.push('v'); | ||
+ | word.push('e'); | ||
+ | word.push('t'); | ||
+ | word.push('e'); | ||
+ | |||
+ | while(!word.empty()) { | ||
+ | printf("%c", word.top()); | ||
+ | word.pop(); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Interogarea dimensiunii == | ||
+ | |||
+ | Pentru interogarea dimensiunii, se definește următoarea metodă: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
+ | /** | ||
+ | * Metoda intoarce numarul de elemente din stiva. | ||
+ | * @return numarul de elemente din stiva. | ||
+ | */ | ||
+ | uint32_t size(); | ||
− | |||
/** | /** | ||
− | * | + | * Metoda intoarce true daca stiva este goala. |
− | * @ | + | * @return true daca stiva este goala. |
− | |||
*/ | */ | ||
− | + | bool empty(); | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Exemplu: | |
+ | |||
+ | <syntaxhighlight lang="cpp" highlight="18,20"> | ||
+ | #include <stack> | ||
+ | #include <cstdio> | ||
+ | using std::stack; | ||
+ | |||
+ | int main() { | ||
+ | stack<char> word; | ||
+ | word.push('c'); | ||
+ | word.push('a'); | ||
+ | word.push('s'); | ||
+ | word.push('t'); | ||
+ | word.push('r'); | ||
+ | word.push('a'); | ||
+ | word.push('v'); | ||
+ | word.push('e'); | ||
+ | word.push('t'); | ||
+ | word.push('e'); | ||
+ | |||
+ | printf("The stack has %u elements!\n", word.size()); | ||
+ | |||
+ | while(!word.empty()) { | ||
+ | printf("%c", word.top()); | ||
+ | word.pop(); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
== Adăugarea unui element - push == | == Adăugarea unui element - push == | ||
− | Pentru adăugarea unui element ''' | + | Pentru adăugarea unui element '''value''' în stivă, se definește următoarea metodă: |
− | <syntaxhighlight lang=" | + | <syntaxhighlight lang="cpp"> |
+ | /** | ||
+ | * Metoda inserează elementul value în stivă. | ||
+ | * @param value elementul ce trebuie adăugat. | ||
+ | */ | ||
+ | void push(T value); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Exemplu: | ||
+ | |||
+ | <syntaxhighlight lang="cpp" highlight="7-16"> | ||
+ | #include <stack> | ||
+ | #include <cstdio> | ||
+ | using std::stack; | ||
+ | |||
+ | int main() { | ||
+ | stack<char> word; | ||
+ | word.push('c'); | ||
+ | word.push('a'); | ||
+ | word.push('s'); | ||
+ | word.push('t'); | ||
+ | word.push('r'); | ||
+ | word.push('a'); | ||
+ | word.push('v'); | ||
+ | word.push('e'); | ||
+ | word.push('t'); | ||
+ | word.push('e'); | ||
+ | |||
+ | printf("The stack has %u elements!\n", word.size()); | ||
+ | |||
+ | while(!word.empty()) { | ||
+ | printf("%c", word.top()); | ||
+ | word.pop(); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Eliminarea unui element - pop == | ||
+ | |||
+ | Pentru eliminarea elementului din vârful stivei, se definește următoarea metodă: | ||
+ | |||
+ | <syntaxhighlight lang="cpp"> | ||
/** | /** | ||
− | * | + | * Metoda elimina următorul element din stivă. |
− | |||
− | |||
*/ | */ | ||
− | void | + | void pop(); |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Exemplu: | |
− | + | ||
− | + | <syntaxhighlight lang="cpp" highlight="22"> | |
− | + | #include <stack> | |
− | + | #include <cstdio> | |
− | + | using std::stack; | |
+ | |||
+ | int main() { | ||
+ | stack<char> word; | ||
+ | word.push('c'); | ||
+ | word.push('a'); | ||
+ | word.push('s'); | ||
+ | word.push('t'); | ||
+ | word.push('r'); | ||
+ | word.push('a'); | ||
+ | word.push('v'); | ||
+ | word.push('e'); | ||
+ | word.push('t'); | ||
+ | word.push('e'); | ||
+ | |||
+ | printf("The stack has %u elements!\n", word.size()); | ||
+ | |||
+ | while(!word.empty()) { | ||
+ | printf("%c", word.top()); | ||
+ | word.pop(); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
− | == | + | == Vizualizarea primului element din stivă - top == |
− | Pentru | + | Pentru vizualizarea primului element din stivă, fără a-l extrage, se definește următoarea metodă: |
− | <syntaxhighlight lang=" | + | <syntaxhighlight lang="cpp"> |
/** | /** | ||
− | * | + | * Metoda întoarce următorul element din stivă, fără a-l extrage. |
− | * @return următorul element din | + | * @return următorul element din stivă. |
*/ | */ | ||
− | + | T top(); | |
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Exemplu: | |
− | + | ||
− | # | + | <syntaxhighlight lang="cpp" highlight="21"> |
− | + | #include <stack> | |
− | + | #include <cstdio> | |
− | + | using std::stack; | |
− | + | ||
− | + | int main() { | |
− | + | stack<char> word; | |
+ | word.push('c'); | ||
+ | word.push('a'); | ||
+ | word.push('s'); | ||
+ | word.push('t'); | ||
+ | word.push('r'); | ||
+ | word.push('a'); | ||
+ | word.push('v'); | ||
+ | word.push('e'); | ||
+ | word.push('t'); | ||
+ | word.push('e'); | ||
+ | |||
+ | printf("The stack has %u elements!\n", word.size()); | ||
+ | |||
+ | while(!word.empty()) { | ||
+ | printf("%c", word.top()); | ||
+ | word.pop(); | ||
+ | } | ||
+ | printf("\n"); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> |
Versiunea curentă din 13 aprilie 2017 12:41
În acest laborator se vor utiliza stive și cozi din STL pentru rezolvarea de probleme.
Coada
Coada este o structură de date de tip FIFO (First In First Out), care stochează o colecție de elemente în ordinea în care au fost adăugate.
Coada are următoarele proprietăți:
- Datele sunt stocate într-o anumită ordine (se poate spune că un element este plasat înaintea sau după un alt element în structură).
- Numărul de elemente ce poate fi stocat de structură este nelimitat sau limitat, în funcție de implementare.
- Elementele stocate în coadă sunt de același fel.
- Elementele pot fi adăugate doar la unul din capete și extrase doar de la celălalt - primul element inserat este primul care este extras.
Coada suportă următoarele operații de bază:
- Interogarea numărului de elemente din coadă.
- Verificarea dacă coada este goală.
- Verificarea dacă coada este plină (pentru cozi limitate).
- Adăugarea unui element în coadă (push).
- Extragerea unui element din coadă (pop).
- Vizualizarea unui element din coadă fără extragerea acestuia (peek).
Implementarea cozii
Deoarece coada este o particularizare a unei secvențe în care doar o parte din operații sunt expuse utilizatorului, toate implementările de secvențe pot fi utilizate pentru implementări de cozi. Totuși, deoarece STL este implementat pentru eficiență maximă, doar structurile care oferă operații în timp minim sunt expuse pentru utilizarea în cozi: std:list și std::deque. Un deque (Double-Ended Queue) este o structură de date care permite inserția și eliminarea de elemente din ambele capete în timp constant.
Clasa care implementeaza cozi în STL este std::queue, este definită în header-ul queue
și folosește implicit un std::deque
pentru stocarea datelor:
#include <queue>
#include <cstdio>
int main() {
std::queue<int> myQueue;
myQueue.push(10);
myQueue.push(11);
myQueue.push(12);
printf("Stack head is: %d\n", myQueue.front());
return 0;
}
Dacă doriți să utilizați o listă dublu înlănțuită pentru implementarea de cozi, sintaxa este următoarea:
#include <queue>
#include <list>
#include <cstdio>
int main() {
std::queue<int, std::list<int>> myListQueue;
myListQueue.push(10);
myListQueue.push(11);
myListQueue.push(12);
printf("Stack head of my list implemnted queue is: %d\n", myListQueue.front());
return 0;
}
Crearea unui std::queue
Pentru crearea unei cozi noi, se definește următorul constructor:
/**
* Constructorul alocă memorie și creeaza un un nou std::queue.
*/
queue();
Exemplu:
#include <queue>
#include <cstdio>
using std::queue;
int main() {
queue<float> myQueue;
myQueue.push(0.1);
printf("Queue is empty: %d\n", myQueue.empty());
return 0;
}
Interogarea dimensiunii
Pentru interogarea dimensiunii, se definește următoarea funcție:
/**
* Metoda intoarce numarul de elemente din coada.
* @return numarul de elemente din coada.
*/
uint32_t size();
Exemplu:
#include <queue>
#include <cstdio>
int main() {
std::queue<char> charQueue;
charQueue.push('a');
charQueue.push('b');
charQueue.push('c');
printf("The queue has %u elements!\n", charQueue.size());
return 0;
}
Adăugarea unui element - push
Pentru adăugarea unui element value în coadă, se definește următoarea funcție:
/**
* Metoda inserează elementul value în coadă.
* @param value elementul ce trebuie adăugat.
*/
void push(T value);
Exemplu:
#include <queue>
#include <cstdio>
int main() {
std::queue<char> charQueue;
charQueue.push('a');
charQueue.push('b');
charQueue.push('c');
printf("The queue has %u elements!\n", charQueue.size());
return 0;
}
Eliminarea elementului din vârful cozii - pop
Pentru extragerea unui element din coadă, se definește următoarea metodă:
/**
* Metoda elimina următorul element din coadă.
*/
void pop();
Exemplu:
#include <queue>
#include <cstdio>
int main() {
std::queue<char> charQueue;
charQueue.push('a');
charQueue.push('b');
charQueue.push('c');
printf("Next char is: %c\n", charQueue.front());
charQueue.pop();
printf("Next char is: %c\n", charQueue.front());
charQueue.pop();
printf("Next char is: %c\n", charQueue.front());
charQueue.pop();
return 0;
}
Vizualizarea primului element din coadă - front
Pentru vizualizarea primului element din coadă, fără a-l extrage, se definește următoarea metodă:
/**
* Metoda întoarce următorul element din coadă, fără a-l extrage.
* @return următorul element din coadă
*/
T front();
Exemplu:
#include <queue>
#include <cstdio>
int main() {
std::queue<char> charQueue;
charQueue.push('a');
charQueue.push('b');
charQueue.push('c');
printf("Next char is: %c\n", charQueue.front());
charQueue.pop();
printf("Next char is: %c\n", charQueue.front());
charQueue.pop();
printf("Next char is: %c\n", charQueue.front());
charQueue.pop();
return 0;
}
Stiva
Stiva este o structură de date de tip LIFO (Last In First Out), care stochează o colecție de elemente în ordinea în care au fost adăugate.
Stiva are următoarele proprietăți:
- Datele sunt stocate într-o anumită ordine (se poate spune că un element este plasat înaintea sau după un alt element în structură).
- Numărul de elemente ce poate fi stocat de structură este nelimitat sau limitat, în funcție de implementare.
- Elementele stocate în stivă sunt de același fel.
- Elementele pot fi adăugate sau extrase doar dintr-un capăt - ultimul element inserat este primul care este extras.
Stiva suportă următoarele operații de bază:
- Interogarea numărului de elemente din stivă.
- Verificarea dacă stiva este goală.
- Verificarea dacă stiva este plină (pentru stive limitate).
- Adăugarea unui element în stivă (push).
- Extragerea unui element din stivă (pop).
- Vizualizarea unui element din stivă fără extragerea acestuia (peek).
Implementarea stivei
În STL, clasa care implementează stiva este std::stack. Ca și coada, această clasă se folosește de o implementare concretă de secvență care poate face operațiile necesare stivei în timp constant. Clasele posibile pentru salvarea datelor unei stive sunt std::vector, std::list și std::deque. Implicit clasa folosită este std::deque
.
Crearea unui obiect de tip std::stack
Pentru crearea unei stive noi, se definește următorul constructor:
/**
* Constructorul alocă memorie și creeaza o noua stiva.
*/
stack();
Exemplu:
#include <stack>
#include <cstdio>
using std::stack;
int main() {
stack<char> word;
word.push('c');
word.push('a');
word.push('s');
word.push('t');
word.push('r');
word.push('a');
word.push('v');
word.push('e');
word.push('t');
word.push('e');
while(!word.empty()) {
printf("%c", word.top());
word.pop();
}
printf("\n");
return 0;
}
Interogarea dimensiunii
Pentru interogarea dimensiunii, se definește următoarea metodă:
/**
* Metoda intoarce numarul de elemente din stiva.
* @return numarul de elemente din stiva.
*/
uint32_t size();
/**
* Metoda intoarce true daca stiva este goala.
* @return true daca stiva este goala.
*/
bool empty();
Exemplu:
#include <stack>
#include <cstdio>
using std::stack;
int main() {
stack<char> word;
word.push('c');
word.push('a');
word.push('s');
word.push('t');
word.push('r');
word.push('a');
word.push('v');
word.push('e');
word.push('t');
word.push('e');
printf("The stack has %u elements!\n", word.size());
while(!word.empty()) {
printf("%c", word.top());
word.pop();
}
printf("\n");
return 0;
}
Adăugarea unui element - push
Pentru adăugarea unui element value în stivă, se definește următoarea metodă:
/**
* Metoda inserează elementul value în stivă.
* @param value elementul ce trebuie adăugat.
*/
void push(T value);
Exemplu:
#include <stack>
#include <cstdio>
using std::stack;
int main() {
stack<char> word;
word.push('c');
word.push('a');
word.push('s');
word.push('t');
word.push('r');
word.push('a');
word.push('v');
word.push('e');
word.push('t');
word.push('e');
printf("The stack has %u elements!\n", word.size());
while(!word.empty()) {
printf("%c", word.top());
word.pop();
}
printf("\n");
return 0;
}
Eliminarea unui element - pop
Pentru eliminarea elementului din vârful stivei, se definește următoarea metodă:
/**
* Metoda elimina următorul element din stivă.
*/
void pop();
Exemplu:
#include <stack>
#include <cstdio>
using std::stack;
int main() {
stack<char> word;
word.push('c');
word.push('a');
word.push('s');
word.push('t');
word.push('r');
word.push('a');
word.push('v');
word.push('e');
word.push('t');
word.push('e');
printf("The stack has %u elements!\n", word.size());
while(!word.empty()) {
printf("%c", word.top());
word.pop();
}
printf("\n");
return 0;
}
Vizualizarea primului element din stivă - top
Pentru vizualizarea primului element din stivă, fără a-l extrage, se definește următoarea metodă:
/**
* Metoda întoarce următorul element din stivă, fără a-l extrage.
* @return următorul element din stivă.
*/
T top();
Exemplu:
#include <stack>
#include <cstdio>
using std::stack;
int main() {
stack<char> word;
word.push('c');
word.push('a');
word.push('s');
word.push('t');
word.push('r');
word.push('a');
word.push('v');
word.push('e');
word.push('t');
word.push('e');
printf("The stack has %u elements!\n", word.size());
while(!word.empty()) {
printf("%c", word.top());
word.pop();
}
printf("\n");
return 0;
}