-
Notifications
You must be signed in to change notification settings - Fork 0
/
StackAlloc.hpp
58 lines (53 loc) · 1.28 KB
/
StackAlloc.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
#include<memory>
template<typename T>
struct _StackNode
{
T data;
_StackNode* prev;
};
template<typename T,typename Alloc = std::allocator<T>>
class StackAlloc
{
public:
using Node = _StackNode<T>;
using allocator = typename Alloc::template rebind<Node>::other;
StackAlloc():_head(nullptr){}
~StackAlloc(){clear();}
bool empty(){return (_head == nullptr);}
void clear()
{
Node* cur = _head;
while(cur != nullptr){
Node* tmp = cur->prev;
//先析构然后回收内存
_allocator.destroy(cur);
_allocator.deallocate(cur,1);
cur = tmp;
}
_head = nullptr;
}
void push(T element)
{
//申请一个节点内存
Node* newNode = _allocator.allocate(1);
//调用节点构造函数
_allocator.construct(newNode,Node());
newNode->data = element;
newNode->prev = _head;
_head = newNode;
}
T pop()
{
T res = _head->data;
Node* tmp = _head->prev;
//先析构然后释放内存
_allocator.destroy(_head);
_allocator.deallocate(_head,1);
_head = tmp;
return res;
}
T top(){return (_head->data);}
private:
allocator _allocator;
Node* _head;
};