Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- template <typename ElemT, size_t size>
- class Stack
- {
- ElemT storage[size];
- int topPosition;
- static const int emptyStack{ -1 };
- public:
- Stack() : topPosition{ emptyStack } {}
- size_t getSize()const { return size; }
- bool empty()const { return topPosition == emptyStack; }
- bool full()const { return topPosition == size - 1; }
- ElemT& top() { return storage[topPosition]; }
- const ElemT& top()const { return storage[topPosition]; }
- bool push(const ElemT& elem)
- {
- if (!full())
- {
- storage[++topPosition] = elem;
- return true;
- }
- return false;
- }
- bool pop()
- {
- if (!empty())
- {
- --topPosition;
- return true;
- }
- return false;
- }
- template <typename ElemT, size_t size>
- friend std::ostream& operator<<(std::ostream& out, const Stack<ElemT, size>& stack);
- };
- template <typename ElemT, size_t size>
- std::ostream& operator<<(std::ostream& out, const Stack<ElemT, size>& stack)
- {
- if (!stack.empty())
- {
- out << stack.top() << '\n';
- }
- else
- {
- out << "[empty]\n";
- }
- return out;
- }
- int main()
- {
- Stack<int, 5> stack;
- std::cout << "Pushing in...\n";
- for (int cnt{ 0 }; !stack.full(); stack.push(cnt++))
- {
- std::cout << cnt << '\n';
- }
- stack.push(100);
- std::cout << stack << '\n';
- std::cout << "Poping out...\n";
- for (;!stack.empty(); stack.pop())
- {
- std::cout << stack;
- }
- stack.pop();
- std::cout << stack;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement