Stack
Príklad implementácie zásobniku reťazcov. Úložisko prvkov zásobníka je implementovaný pomocou zoznamu (list) nakoľko je efektívnejší na pridanie na začiatok.
#include <string>
#include <list>
class Stack {
private:
std::list<std::string> values;
public:
Stack() = default;
~Stack() = default;
void push(std::string value) {
values.insert(values.begin(), value);
}
std::string pop() {
std::string front = values.front();
values.pop_front();
return front;
}
std::string top() {
return values.front();
}
size_t size() { return values.size(); }
std::string to_string() {
std::string result;
for (auto it = values.begin(); it != values.end(); it++) {
result += *it + " ";
}
return result;
}
};Vysvetlenie
Ide o LIFO (Last In, First Out) štruktúru – posledný pridaný prvok sa vyberá ako prvý.
Použité knižnice
#include <string> // pre prácu s reťazcami (std::string)
#include <list> // pre obojsmerný zoznam (std::list)
Trieda Stack
Táto trieda predstavuje zásobník reťazcov.
Atribúty (private):
std::list<std::string> values;- Interná dátová štruktúra na ukladanie hodnôt.
std::listje dvojito viazaný zoznam, vďaka čomu je vkladanie a odstraňovanie na začiatku O(1) – ideálne pre zásobník.
Metódy triedy
Stack() a ~Stack()
Stack() = default;
~Stack() = default;- Používajú predvolené konštruktory a destruktory (žiadna špeciálna inicializácia alebo čistenie nie je potrebné).
void push(std::string value)
values.insert(values.begin(), value);- Vloží nový prvok na začiatok zoznamu (vrchol zásobníka).
- Rýchla operácia v
std::list(O(1)).
std::string pop()
std::string front = values.front();
values.pop_front();
return front;- Zoberie prvý prvok (vrchol zásobníka), odstráni ho a vráti.
- LIFO logika: posledný pridaný prvok ide ako prvý von.
std::string top()
return values.front();- Vráti prvok na vrchole zásobníka bez jeho odstránenia.
size_t size()
return values.size();- Vráti počet prvkov v zásobníku.
std::string to_string()
std::string result;
for (auto it = values.begin(); it != values.end(); it++) {
result += *it + " ";
}
return result;- Prejde všetky hodnoty v zásobníku (zhora nadol) a spojí ich do jedného reťazca oddeleného medzerou.
- Môže slúžiť na výpis obsahu zásobníka.
Použitie (príklad)
Stack s;
s.push("A");
s.push("B");
s.push("C");
std::cout << s.to_string(); // "C B A "
std::cout << s.top(); // "C"
std::cout << s.pop(); // "C"
std::cout << s.top(); // "B"
Prečo std::list?
std::listumožňuje efektívne vkladanie/odoberanie na začiatku (O(1)).std::vectorby mohol byť pomalší pri vkladaní na začiatok (O(n)).- Alebo možno použiť
std::stackz<stack>ak netreba vlastnú implementáciu.