1. 程式人生 > >數據結構第八篇——鏈棧

數據結構第八篇——鏈棧

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 24
void 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 }

簡單的測試結果如下:

技術分享

數據結構第八篇——鏈棧