1 //Node.h 2 template<typename ElemType> 3 struct Node 4 { 5 ElemType data; 6 Node<ElemType> *next; 7 Node(); 8 Node(ElemType item,Node<ElemType> * link=NULL); 9 }; 10 template<typename ElemType> 11 Node<ElemType>::Node() 12 { 13 next=NULL; 14 } 15 template<typename ElemType> 16 Node<ElemType>::Node(ElemType item,Node<ElemType> *link) 17 { 18 data=item; 19 next=link; 20 } 21 //LinkStack.h 22 template<typename ElemType> 23 class LinkStack 24 { 25 protected: 26 Node<ElemType> *top; 27 int count; 28 public: 29 LinkStack(); 30 virtual ~LinkStack(); 31 int Length() const; 32 bool Empty() const; 33 void Clear(); 34 void Traverse(void (*visit)(const ElemType &)) const; 35 bool Push(const ElemType &e); 36 bool Top(ElemType &e) const; 37 bool Pop(ElemType &e); 38 LinkStack(const LinkStack<ElemType> ©); 39 LinkStack<ElemType> &operator=(const LinkStack<ElemType> ©); 40 }; 41 template<typename ElemType> 42 LinkStack<ElemType>::LinkStack() 43 { 44 top=NULL; 45 count=0; 46 } 47 template<typename ElemType> 48 LinkStack<ElemType>::~LinkStack() 49 { 50 Clear(); 51 } 52 template<typename ElemType> 53 int LinkStack<ElemType>::Length() const 54 { 55 return count; 56 } 57 template<typename ElemType> 58 bool LinkStack<ElemType>::Empty() const 59 { 60 return top==NULL; 61 } 62 template<typename ElemType> 63 void LinkStack<ElemType>::Clear() 64 { 65 ElemType tmpElem; 66 while(!Empty()) 67 Pop(tmpElem); 68 } 69 template<typename ElemType> 70 void LinkStack<ElemType>::Traverse(void (*visit)(const ElemType &))const 71 { 72 Node<ElemType> *tmpPtr; 73 LinkStack<ElemType> tmpS; 74 for(tmpPtr=top;tmpPtr!=NULL;tmpPtr=tmpPtr->next) 75 tmpS.Push(tmpPtr->data); 76 for(tmpPtr=tmpS.top;tmpPtr!=NULL;tmpPtr=tmpPtr->next) 77 (*visit)(tmpPtr->data); 78 } 79 template<typename ElemType> 80 bool LinkStack<ElemType>::Push(const ElemType &e) 81 { 82 Node<ElemType> *newTop=new Node<ElemType>(e,top); 83 if(newTop==NULL)//内存耗尽 84 return false; 85 else 86 { 87 top=newTop; 88 count++; 89 return true; 90 } 91 92 } 93 template<typename ElemType> 94 bool LinkStack<ElemType>::Top(ElemType &e)const 95 { 96 if(Empty()) 97 return false; 98 else 99 { 100 e=top->data; 101 return true; 102 } 103 104 } 105 template<typename ElemType> 106 bool LinkStack<ElemType>::Pop(ElemType &e) 107 { 108 if(Empty()) 109 return false; 110 else 111 { 112 Node<ElemType> *old_top=top; 113 top=old_top->next; 114 e=old_top->data; 115 count--; 116 delete old_top; 117 return true; 118 } 119 120 } 121 template<typename ElemType> 122 LinkStack<ElemType>::LinkStack(const LinkStack<ElemType> ©) 123 { 124 if(Empty()) 125 { 126 top=NULL; 127 count=0; 128 } 129 else 130 { 131 top=new Node<ElemType>(copy.top->data); 132 count=copy.count; 133 node<ElemType> *buttomPtr=top; 134 for(Node<ElemType> *tmpPtr=copy.top->next;tmPtr!=NULL;tmpPtr=tmpPtr->next) 135 { 136 buttomPtr->next=new Node<ElemType> (tmpPtr->data); 137 buttomPtr=buttomPtr->next; 138 } 139 140 } 141 } 142 template<typename ElemType> 143 LinkStack<ElemType> &LinkStack<ElemType>::operator=(const LinkStack<ElemType> ©) 144 { 145 if(©!=this) 146 { 147 if(copy.Empty()) 148 { 149 top=NULL; 150 count=0; 151 } 152 else 153 { 154 Clear(); 155 top=new Node<ElemType>(copy.top->data); 156 count=copy.count; 157 Node<ElemType> *buttomTop=top; 158 for(Node<ElemType> *tmpPtr=copy.top->next;tmpPtr!=NULL;tmpPtr=tmpPtr->next) 159 { 160 buttomTop->next=new node<ElemType>(tmpPtr->data); 161 buttomTop=buttomTop->next; 162 } 163 164 } 165 } 166 167 }