栈的最基本特点先进后出,本文简单介绍一下用c++写的链式栈
头文件
1 #ifndef LINKEDSTACK_H 2 #define LINKEDSTACK_H 3 4 template<class T> class LinkedStack; 5 6 template<class T> 7 class ChainNode 8 { 9 friend class LinkedStack<T>; 10 private: 11 ChainNode(const T& theData, ChainNode *n=0) 12 :data(theData), link(n){}//创建新的结点,"link(n)"表示指向已经入栈的结点 13 T data; 14 ChainNode<T> *link; 15 }; 16 17 template<class T> 18 class LinkedStack 19 { 20 public: 21 LinkedStack():top(0){} //初始化栈,顶结点指针指向空 22 ~LinkedStack() { MakeEmpty(); } //析构函数,清空栈 23 bool IsEmpty() const;//判断栈是否为空 24 T& Top() const;//返回栈顶结点数据域 25 void Push(const T& e);//从栈顶放入结点 26 void Pop();//从栈顶删除结点 27 void MakeEmpty();//不断从栈顶删除结点直到栈为空 28 private: 29 ChainNode<T> *top; 30 }; 31 32 template<class T> 33 bool LinkedStack<T>::IsEmpty() const 34 { 35 return top == 0; 36 } 37 38 template<class T> 39 void LinkedStack<T>::Push(const T &e) 40 { 41 top = new ChainNode<T>(e, top);//“12行”刚入栈的新节点变为顶结点并指向已经入栈的结点 42 } 43 44 template<class T> 45 T& LinkedStack<T>::Top() const 46 { 47 if (this->IsEmpty()) 48 throw"Stack is empty."; 49 return top->data; 50 } 51 52 template<class T> 53 void LinkedStack<T>::Pop() 54 { 55 if (this->IsEmpty()) 56 throw"Stack is empty. Cannot delete."; 57 ChainNode<T> *delNode = top;//用指针保存要删除的栈顶结点,以备删除该节点 58 top = top->link; 59 delete delNode;//通过指针找到即将被删除的顶结点同时删除 60 } 61 62 template<class T> 63 void LinkedStack<T>::MakeEmpty() 64 { 65 while (!IsEmpty()) 66 Pop(); 67 } 68 #endif
源文件,测试用
1 #include<iostream> 2 #include"linkedstack.h" 3 4 using namespace std; 5 6 int main() 7 { 8 cout << "测试链式栈" << endl; 9 10 LinkedStack<int> stack1; 11 stack1.Push(5); 12 cout << stack1.Top() << endl; 13 stack1.Push(15); 14 cout << stack1.Top() << endl; 15 stack1.Push(25); 16 cout << stack1.Top() << endl; 17 stack1.Pop(); 18 cout << stack1.Top() << endl; 19 20 return 0; 21 }