做完单链表,顺便实现个栈。加了个模板。
#ifndef _STACK_H
#define _STACK_H
// 定义链表栈类
template <class T>
class Node
{
public:
Node() { next = NULL; }
Node(T elem) { data = elem; next = NULL; }
T data; //栈存储的元素
Node* next; //指向下一结点的指针
};
template <class T>
class Stack
{
public:
Stack();
~Stack();
public:
void push(T elem); // 进栈
T pop(); // 出栈
bool isEmpty(); //判断栈是否为空
T getTop(); // 获得栈顶元素
void clear();
private:
Node<T>* m_Top; // 栈顶
Node<T>* m_Bottom; // 栈底
};
template <class T>
void Stack<T>::clear()
{
if (isEmpty())
{
return;
}
Node<T> * tmp = m_Top;
while (m_Top != m_Bottom)
{
tmp = m_Top;
delete m_Top;
m_Top = tmp->next;
}
delete m_Top;
m_Top = NULL;
m_Bottom = NULL;
}
template <class T>
T Stack<T>::getTop()
{
return m_Top->data;
}
template <class T>
T Stack<T>::pop()
{
if (isEmpty())
{
return NULL;
}
T elem = m_Top->data;
Node<T>* tmp = m_Bottom;
while (tmp->next!=m_Top)
{
tmp = tmp->next;
}
delete m_Top;
m_Top = tmp;
return elem;
}
template <class T>
void Stack<T>::push(T elem)
{
if (isEmpty())
{
m_Bottom = new Node<T>(elem);
m_Top = m_Bottom;
}
else
{
m_Top->next = new Node<T>(elem);
m_Top = m_Top->next;
}
}
template <class T>
bool Stack<T>::isEmpty()
{
return m_Top == NULL;
}
template <class T>
Stack<T>::~Stack()
{
Node<T> * tmp = m_Top;
while (m_Top != m_Bottom)
{
tmp = m_Top;
delete m_Top;
m_Top = tmp->next;
}
delete m_Top;
m_Top = NULL;
m_Bottom = NULL;
}
template<class T>
inline Stack<T>::Stack()
{
m_Bottom = new Node<T>();
m_Top = m_Bottom;
m_Top->next = NULL;
m_Bottom->next = NULL;
}
#endif // _STACK_H