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::list je 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::list umožňuje efektívne vkladanie/odoberanie na začiatku (O(1)).
  • std::vector by mohol byť pomalší pri vkladaní na začiatok (O(n)).
  • Alebo možno použiť std::stack z <stack> ak netreba vlastnú implementáciu.