经典数据结构之链表实现的栈

来源:互联网 发布:乱码修复软件 编辑:程序博客网 时间:2024/05/22 05:23

数组和链表是线性表的两种表现方式,而栈作为一种适配器,既可以用数组实现,也可以用链表实现,由于采用后进先出的方式,两者添加和删除元素都是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;}


原创粉丝点击