1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
#ifndef CPP_STACK_HPP
#define CPP_STACK_HPP 1

#include <cassert>
#include <iostream>

class Stack
{
    public:
        Stack()
            : top(nullptr)
        {
        }

        ~Stack()
        {
            while(!empty()) {
                pop();
            }
        }

        bool empty() const
        {
            return !top;
        }

        void push(double value)
        {
            Element *add = new Element;
            add->last    = top;
            add->value   = value;
            top          = add;
        }

        double pop()
        {
            assert(!empty());

            Element *remove = top;
            top             = remove->last;
            double  value   = remove->value;
            delete remove;
            return value;
        }

        void print(const char *txt) const
        {
            std::cout << txt << ": ";
            print_elements(top);
            std::cout << ";" << std::endl;
        }

    private:
        struct Element
        {
            double      value;
            Element     *last;
        };

        void print_elements(const Element *top) const
        {
            if (top) {
                print_elements(top->last);
                std::cout << "   " << top->value;
            }
        }

        Element     *top;
};

#endif // CPP_STACK_HPP