-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStack.hpp
99 lines (86 loc) · 2.08 KB
/
Stack.hpp
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#ifndef STACK_STACK_HPP
#define STACK_STACK_HPP
#include <cstdio>
#include <cstdlib>
#include <exception>
#include <memory>
#include <iostream>
template <typename T>
class Stack {
struct Node {
T data;
Node *before;
Node *after;
};
Node *head;
Node *tail;
std::size_t _size;
public:
Stack() : _size(0), head(new Node()), tail(new Node()) {
head->before = nullptr;
tail->after = nullptr;
head->after = tail;
tail->before = head;
}
~Stack() {
Node *ptr = tail;
while(ptr != head) {
ptr = ptr->before;
delete ptr->after;
}
delete ptr;
}
void clear() {
Node *node = tail->before;
head->after=tail;
tail->before=head;
while(node->before != head) {
node = node->before;
delete node->after;
}
delete node;
_size = 0;
}
constexpr bool empty() { return _size == 0; }
void push(T const &element) {
auto node = new Node();
node->data = element;
node->before = tail->before;
node->before->after = node;
node->after = tail;
tail->before = node;
++_size;
}
void push(T &&element) noexcept {
auto node = new Node();
node->data = std::move(element);
node->before = tail->before;
node->before->after = node;
node->after = tail;
tail->before = node;
++_size;
}
void pop() {
if (empty()) throw std::runtime_error("Empty stack!");
Node *node = tail->before;
tail->before = node->before;
tail->before->after = tail;
delete node;
--_size;
}
constexpr std::size_t size() const {
return _size;
}
void swap(Stack &stack) {
std::swap(this->head, stack.head);
std::swap(this->tail, stack.tail);
std::swap(this->_size, stack._size);
}
T const &top() const {
return tail->before->data;
}
T top() {
return tail->before->data;
}
};
#endif