数组和链表是线性表的两种表现方式,而栈作为一种适配器,既可以用数组实现,也可以用链表实现,由于采用后进先出的方式,两者添加和删除元素都是O(1)的。主要区别之处是数组本身使用的空间较小,因为只需要用n个元素外加长度属性就好了。链表使用的空间较大,这是因为节点本身需要一个指针和数据来表示。
#include <stdio.h>
#include <assert.h>
template<typename T>
struct CLinkStack;
template<typename T>
struct SNode{
friend CLinkStack<T>;
public:
SNode();
SNode(const T& data);
private:
// members;
T m_nData;
SNode<T>* m_pNext;
};
template<typename T>
SNode<T>::SNode():
m_pNext(NULL){}
template<typename T>
SNode<T>::SNode(const T& data):
m_nData(data), m_pNext(NULL) {}
template<typename T>
class CLinkStack{
private:
SNode<T>* m_pTop;
public:
// constructors;
CLinkStack();
~CLinkStack();
// methods;
T mTop() const;
CLinkStack<T>& mAdd(const T& data);
CLinkStack<T>& mDelete();
bool mIsEmpty() const;
};
template<typename T>
CLinkStack<T>::CLinkStack(){
m_pTop = NULL;
}
template<typename T>
CLinkStack<T>::~CLinkStack(){
while(m_pTop != NULL){
SNode<T>* pTmp = m_pTop;
m_pTop = m_pTop -> m_pNext;
delete pTmp;
}
}
template<typename T>
CLinkStack<T>& CLinkStack<T>::mAdd(const T& data){
SNode<T>* pTmp = new SNode<T>(data);
pTmp -> m_pNext = m_pTop;
m_pTop = pTmp;
return *this;
}
template<typename T>
CLinkStack<T>& CLinkStack<T>::mDelete(){
if(m_pTop != NULL){
SNode<T>* pTmp = m_pTop;
m_pTop = m_pTop -> m_pNext;
delete [] pTmp;
}
return *this;
}
template<typename T>
bool CLinkStack<T>::mIsEmpty() const{
return ((m_pTop == NULL) ? true : false);
}
template<typename T>
T CLinkStack<T>::mTop() const{
assert(m_pTop != NULL);
return m_pTop->m_nData;
}