Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76527
  • 博文数量: 35
  • 博客积分: 131
  • 博客等级: 入伍新兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-11 22:57
文章分类

全部博文(35)

文章存档

2016年(15)

2013年(1)

2012年(6)

2011年(13)

我的朋友

分类: C/C++

2012-04-07 21:56:38

栈这种数据结构是一个工具性的数据结构,通常被其它复杂数据结构所使用。比如实现二叉树的遍历的非递归算法。下面就用C++模板实现栈数据结构的一个较完整代码!在书本《数据结构(C语言版)--严慰明》提到栈可以用数组,也可以用链表实现,这里只用链表实现这一数据结构。

点击(此处)折叠或打开

  1. //Stack.h
  2. //双链表栈数据结构C++模块的实现
  3. //理论知识参考《数据结构(C语言版)--严慰明》
  4. #ifndef _STACK_H_
  5. #define _STACK_H_
  6. #include <iostream>
  7. using namespace std;
  8. namespace _STACK_
  9. {
  10.  //栈中的元素
  11.  template <typename T>
  12.  class StackNode
  13.  {
  14.  public:
  15.   StackNode()
  16.   {
  17.    this->mElement = 0;
  18.    this->mpNext = NULL;
  19.    this->mpPrev = NULL;
  20.   }
  21.   
  22.   ~StackNode()
  23.   {
  24.    this->mElement = 0;
  25.    this->mpNext = NULL;
  26.    this->mpPrev = NULL;
  27.   }
  28.   
  29.   T& getElement(void)
  30.   {
  31.    return mElement;
  32.   }
  33.   
  34.   //重载"<<"操作符,以便对栈节点输出,注意以friend重载“<<”操作符要加上"<>"
  35.   friend ostream& operator << <>(ostream& ost,StackNode<T>& src)
  36.   {
  37.    ost << src.mElement;
  38.    return ost;
  39.   }
  40.   
  41.  //protected:
  42.   T mElement; //存放的数据
  43.   StackNode<T>* mpNext; //指向后继节点指针
  44.   StackNode<T>* mpPrev; //指向前驱节点指针
  45.   template <typename T>
  46.   friend class Stack;
  47.  };

  48.  template <typename T>
  49.  class Stack
  50.  {
  51.  public:
  52.   Stack();
  53.   ~Stack();
  54.   bool push(const T& element);
  55.   T pop(void);
  56.   bool isEmpty(void);
  57.   bool clear(void);
  58.   int size();
  59.   friend ostream& operator<< <>(ostream& ost,Stack<T>& src);
  60.  protected:
  61.   StackNode<T>* createNode(const T& element);
  62.  protected:
  63.   StackNode<T>* mpHead;
  64.   StackNode<T>* mpTop;
  65.  };

  66.  template <typename T>
  67.  Stack<T>::Stack()
  68.  {
  69.   T i = T();
  70.   //创建一个带有头节点的双链栈,这个节点不存入任何数据
  71.   this->mpHead = this->createNode(i);
  72.   this->mpTop = this->mpHead;
  73.  }

  74.  template <typename T>
  75.  Stack<T>::~Stack()
  76.  {
  77.   this->clear();
  78.   delete this->mpHead;
  79.   this->mpHead = NULL;
  80.   this->mpTop = NULL;
  81.  }

  82.  template <typename T>
  83.  StackNode<T>* Stack<T>::createNode(const T& element)
  84.  {
  85.   StackNode<T>* pNode = new StackNode<T>;
  86.   if (pNode)
  87.   {
  88.    pNode->mElement = element;
  89.    pNode->mpNext = NULL;
  90.    pNode->mpPrev = NULL;
  91.   }
  92.   return pNode;
  93.  }

  94.  template <typename T>
  95.  bool Stack<T>::push(const T& element)
  96.  {
  97.   StackNode<T>* pNode = createNode(element);
  98.   if(this->mpHead->mpNext == NULL)
  99.   {
  100.    this->mpHead->mpNext = pNode;
  101.    pNode->mpPrev = this->mpHead;
  102.   }
  103.   else
  104.   {
  105.    this->mpTop->mpNext = pNode;
  106.    pNode->mpPrev = this->mpTop;
  107.   }
  108.   this->mpTop = pNode;
  109.   return true;
  110.  }

  111.  template <typename T>
  112.  T Stack<T>::pop(void)
  113.  {
  114.   if (this->mpTop != this->mpHead)
  115.   {
  116.    StackNode<T>* pNode = this->mpTop;
  117.    this->mpTop = this->mpTop->mpPrev;
  118.    T elem = pNode->mElement;
  119.    pNode ->mpNext = pNode->mpPrev = NULL;
  120.    delete pNode;
  121.    pNode = NULL;
  122.    return elem;
  123.   }
  124.   return (T)0;
  125.  }

  126.  template <typename T>
  127.  bool Stack<T>::isEmpty(void)
  128.  {
  129.   return (this->mpHead == this->mpTop);
  130.  }

  131.  template <typename T>
  132.  bool Stack<T>::clear(void)
  133.  {
  134.   StackNode<T>* pNode = this->mpTop;
  135.   while((pNode = this->mpTop) != this->mpHead)
  136.   {
  137.    this->mpTop =pNode->mpPrev;
  138.    pNode->mpNext = NULL;
  139.    pNode->mpPrev = NULL;
  140.    delete pNode;
  141.    pNode = NULL;
  142.   }
  143.   return true;
  144.  }

  145.  template <typename T>
  146.  int Stack<T>::size()
  147.  {
  148.   int iCount = 0;
  149.   StackNode<T>* pNode = this->mpTop;
  150.   while(pNode != this->mpHead)
  151.   {
  152.    iCount++;
  153.    pNode = pNode->mpPrev;
  154.   }
  155.   return iCount;
  156.  }

  157.  template <typename T>
  158.  ostream& operator<< <>(ostream& ost,Stack<T>& src)
  159.  {
  160.   StackNode<T>* pNode = src.mpTop;
  161.   while( src.mpHead)
  162.   {
  163.    ost << *pNode << " ";
  164.    pNode = pNode->mpPrev;
  165.   }
  166.   return ost;
  167.  }
  168. }
  169. #endif

以上就是栈数据结构的实现。

阅读(3689) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~