栈的链接存储结构--链栈
链栈的图片:
LinkStack.h
- //LinkStack.h
- #ifndef LINKSTACK_H
- #define LINKSTACK_H
- template <class T>
- struct Node
- {
- T data;
- Node<T> *next; //此处<T>也可以省略
- };
- template <class T>
- class LinkStack
- {
- public:
- LinkStack( ); //构造函数,置空链栈
- ~LinkStack( ); //析构函数,释放链栈中各结点的存储空间
- void Push(T x); //将元素x入栈
- T Pop( ); //将栈顶元素出栈
- T GetTop( ); //取栈顶元素(并不删除)
- bool Empty( ); //判断链栈是否为空栈
- private:
- Node<T> *top; //栈顶指针即链栈的头指针
- };
- #endif
LinkStack.cpp
- //LinkStack.cpp
- #include "LinkStack.h"
- /*
- * 前置条件:栈不存在
- * 输 入:无
- * 功 能:栈的初始化
- * 输 出:无
- * 后置条件:构造一个空栈
- */
- template <class T>
- LinkStack<T>::LinkStack( )
- {
- top=NULL;
- }
- /*
- * 前置条件:栈已存在
- * 输 入:无
- * 功 能:销毁栈
- * 输 出:无
- * 后置条件:释放栈所占用的存储空间
- */
- template <class T>
- LinkStack<T>::~LinkStack( )
- {
- while (top)
- {
- Node<T> *p;
- p=top->next;
- delete top;
- top=p;
- }
- }
- /*
- * 前置条件:栈已存在
- * 输 入:节点s
- * 功 能:在栈顶插入该节点
- * 输 出:无
- * 后置条件:如果插入成功,栈顶增加了一个元素
- */
- template<class T>
- void LinkStack<T>::Push(T x)
- {
- Node<T> *s;
- s=new Node<T>;
- s->data = x; //申请一个数据域为x的结点s
- s->next = top;
- top=s; //将结点s插在栈顶
- }
- /*
- * 前置条件:栈已存在
- * 输 入:无
- * 功 能:删除栈顶元素
- * 输 出:如果删除成功,返回被删元素值,否则,抛出异常
- * 后置条件:如果删除成功,栈顶减少了一个元素
- */
- template <class T> T LinkStack<T>::Pop( )
- {
- Node<T> *p;
- int x;
- if (top==NULL) throw "下溢";
- x=top->data; //暂存栈顶元素
- p=top;
- top=top->next; //将栈顶结点摘链
- delete p;
- return x;
- }
- /*
- * 前置条件:栈已存在
- * 输 入:无
- * 功 能:读取当前的栈顶元素
- * 输 出:若栈不空,返回当前的栈顶元素值
- * 后置条件:栈不变
- */
- template <class T>
- T LinkStack<T>::GetTop( )
- {
- if (top!=NULL)
- return top->data;
- }
- /*
- * 前置条件:栈已存在
- * 输 入:无
- * 功 能:判断栈是否为空
- * 输 出:如果栈为空,返回1,否则,返回0
- * 后置条件:栈不变
- */
- template <class T> bool LinkStack<T>::Empty( )
- {
- if(top==NULL)
- return 1;
- else
- return 0;
- }