數據結構第八篇——鏈棧
阿新 • • 發佈:2017-09-23
val 條件 isempty pop 存儲 操作 部分 get sem
?註:未經博主同意,不得轉載。
鏈棧
鏈式存儲的棧稱為鏈棧。可用單鏈表來實現鏈棧,因此其節點結構與單鏈表的結構相同。下面給出這種結構的定義:
若要了解順序棧的內容請跳轉至http://www.cnblogs.com/tenjl-exv/p/7575549.html
鏈棧無棧滿問題,空間可擴充,但有棧空問題,棧空的條件為top->next=NULL。插入與刪除僅在棧頂處進行,鏈式棧的棧頂在鏈表頭。
鏈棧的定義如下:
1 typedef int Data; 2 struct StackNode 3 { 4 Data data; 5 StackNode *next; 6}; 7 8 class Stack 9 { 10 private: 11 StackNode *top; 12 public: 13 Stack() 14 { 15 top=new StackNode; 16 top->next=NULL; 17 } 18 ~Stack() 19 { 20 Clear(); 21 delete top; 22 } 23 24void Push(Data e); 25 Data Pop(); 26 Data GetTop(); 27 bool IsEmpty(); 28 void Clear(); 29 void Print(); 30 };
相關操作算法如下:
1 //判斷棧是否為空 2 bool Stack::IsEmpty() 3 { 4 if(top->next==NULL) 5 return true; 6 else 7 return false; 8 } 9 //取棧頂元素 10 Data Stack::GetTop() 11 { 12 if(top->next==NULL) 13 { 14 cout<<"棧空!"<<endl; 15 exit(0); 16 } 17 else 18 return top->next->data; 19 } 20 //進棧 21 void Stack::Push(Data x) 22 { 23 StackNode *p; 24 p=new StackNode; 25 p->data=x; 26 p->next=top->next; 27 top->next=p; 28 } 29 //出棧 30 Data Stack::Pop() 31 { 32 StackNode *p=NULL; 33 if(top->next==NULL) 34 { 35 cout<<"棧空"<<endl; 36 exit(0); 37 } 38 else 39 { 40 p=top->next; 41 Data retvalue=p->data; 42 top->next=p->next; 43 delete p; 44 return retvalue; 45 } 46 } 47 //清空棧 48 void Stack::Clear() 49 { 50 StackNode *p; 51 while(top->next) 52 { 53 p=top->next; 54 top->next=p->next; 55 delete p; 56 } 57 } 58 //打印數據 59 void Stack::Print() 60 { 61 StackNode *p; 62 p=top->next; 63 while(p) 64 { 65 cout<<p->data<<" "; 66 p=p->next; 67 } 68 cout<<endl; 69 }
測試部分則放在main函數:
1 int main() 2 { 3 Stack stack; 4 Data a[10]={1,5,8,7,9,5,6,7,4} ; 5 Data e; 6 if(stack.IsEmpty()) 7 cout<<"此棧為空"<<endl; 8 else 9 cout<<"此棧不空"<<endl; 10 11 for(int i=0;i<8;++i) 12 stack.Push(a[i]); 13 14 stack.Print(); 15 16 cout<<stack.GetTop()<<endl; 17 18 cout<<"進棧:"; 19 cin>>e; 20 stack.Push(e); 21 stack.Print(); 22 cout<<stack.GetTop()<<endl; 23 24 cout<<"出棧:"; 25 stack.Pop(); 26 stack.Print(); 27 cout<<stack.GetTop()<<endl; 28 29 if(stack.IsEmpty()) 30 cout<<"此棧為空"<<endl; 31 else 32 cout<<"此棧不空"<<endl; 33 34 cout<<"出棧:"; 35 stack.Pop(); 36 stack.Print(); 37 38 cout<<"清空棧:"<<endl; 39 stack.Clear(); 40 41 if(stack.IsEmpty()) 42 cout<<"此棧為空"<<endl; 43 else 44 cout<<"此棧不空"<<endl; 45 46 return 0; 47 }
簡單的測試結果如下:
數據結構第八篇——鏈棧