栈  0.1
数据结构_第3章
linkStack.hpp
Go to the documentation of this file.
1 
12 #ifndef __linkStackIncluded
13 #define __linkStackIncluded
14 
15 #include "Stack.hh"
16 
17 namespace Stack
18 {
19 
20 template <typename T>
21 class linkStack : public Stack<T>
22 {
23 private:
24  struct node
25  {
26  T data;
28 
29  node(const T &x = T(), node *next = nullptr)
30  : data(x), next(next) {}
31  node(T &&x, node *next = nullptr)
32  : data(std::move(x)), next(next) {}
33 
34  ~node() = default;
35  };
36 
37  node *top_p; // 指向栈顶结点
38 
39 public:
40  linkStack();
41  linkStack(std::initializer_list<T> &&il); // 支持列表初始化
42  virtual bool isEmpty() const; // 判栈空
43  virtual void push(const T &elem); // 进栈
44  virtual void push(T &&elem); // 进栈(move)
45  virtual T pop(); // 出栈
46  virtual T top() const; // 读栈顶元素
47  virtual ~linkStack();
48 };
49 
50 template <class T>
52  : top_p(nullptr)
53 {
54 }
55 
56 template <class T>
57 linkStack<T>::linkStack(std::initializer_list<T> &&il)
58  : linkStack()
59 {
60  for (auto &&i : il)
61  push(i);
62 }
63 
64 template <class T>
66 {
67  while (top_p)
68  {
69  auto tmp = top_p->next;
70  delete top_p;
71  top_p = tmp;
72  }
73 }
74 
75 template <class T>
76 void linkStack<T>::push(const T &elem)
77 {
78  top_p = new node(elem, top_p);
79 }
80 
81 template <class T>
82 void linkStack<T>::push(T &&elem)
83 {
84  top_p = new node(std::move(elem), top_p);
85 }
86 
87 template <class T>
89 {
90  T retVal = top_p->data;
91 
92  auto tmp = top_p->next;
93  delete top_p;
94  top_p = tmp;
95 
96  return retVal;
97 }
98 
99 template <class T>
101 {
102  return top_p->data;
103 }
104 
105 template <class T>
107 {
108  return !top_p;
109 }
110 
111 } // namespace Stack
112 #endif
Stack::linkStack::node::data
T data
Definition: linkStack.hpp:26
Stack::linkStack::linkStack
linkStack()
Definition: linkStack.hpp:51
Stack::linkStack::push
virtual void push(const T &elem)
Definition: linkStack.hpp:76
Stack::linkStack
Definition: linkStack.hpp:21
Stack::linkStack::top
virtual T top() const
Definition: linkStack.hpp:100
Stack::linkStack::node::next
node * next
Definition: linkStack.hpp:27
Stack::linkStack::node::node
node(T &&x, node *next=nullptr)
Definition: linkStack.hpp:31
Stack::linkStack::pop
virtual T pop()
Definition: linkStack.hpp:88
Stack::linkStack::top_p
node * top_p
Definition: linkStack.hpp:37
Stack::linkStack::node
Definition: linkStack.hpp:24
Stack::linkStack::node::~node
~node()=default
Stack::linkStack::~linkStack
virtual ~linkStack()
Definition: linkStack.hpp:65
Stack::linkStack::node::node
node(const T &x=T(), node *next=nullptr)
Definition: linkStack.hpp:29
Stack.hh
栈的抽象类
Stack::linkStack::isEmpty
virtual bool isEmpty() const
Definition: linkStack.hpp:106
Stack
Definition: linkStack.hpp:17