1. 程式人生 > >鏈棧和鏈隊列的建立及基本操作

鏈棧和鏈隊列的建立及基本操作

是否為空 數據類型 數據 == ext 判斷 刪除 尾指針 nod

鏈棧:c++版

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 struct Node{
 5     int value; //定義棧中的數據類型為 int 型
 6     Node *next;
 7 };
 8 Node * build_stack(){ //建立空的鏈棧的函數
 9     Node *p=(Node*)malloc(sizeof(Node));
10     p->next=NULL;
11     return p;
12 }
13 bool stack_empty(Node *a){ //
判斷棧是否為空的函數 14 if((a->next)==NULL) return true; //如果下一個地址為空,那麽說明棧為空 15 return false; 16 } 17 int stack_size(Node *a){ //獲取棧的大小的函數 18 Node *p=a->next; 19 int length_size=0; 20 while(p!=NULL){ 21 length_size++; 22 p=p->next; 23 } 24 return length_size; 25
} 26 bool push_stack(Node *a,int value){ //將值為value的元素壓入棧 27 Node *p=(Node *)malloc(sizeof(Node)); 28 if(p==NULL) return false; 29 p->value=value; 30 p->next=a->next; 31 a->next=p; 32 return true; 33 } 34 void pop_stack(Node *a){ //刪除棧頂元素 35 Node *p,*q; 36 p=a->next;
37 q=a->next->next; 38 free(p); //釋放棧頂元素空間 39 a->next=q; //頭指針指向棧頂元素 40 } 41 int get_top(Node *a){ //獲取棧頂元素 42 if(a->next==NULL) return -1; 43 int value=a->next->value; 44 return value; 45 } 46 int main(){ 47 Node *a; 48 a=build_stack(); //調用建棧函數 49 if(a==NULL){ 50 cout<<"建棧失敗!"<<endl; 51 return 0; 52 } 53 cout<<"建棧成功! "<<endl; 54 cout<<"第一行輸入一個n,下一行輸入你要壓入的n個元素 "<<endl; 55 int n; 56 cin>>n; //輸入n,表示n個元素 57 while(n--){ 58 int value; 59 cin>>value; 60 push_stack(a,value); //將輸入的元素壓入棧 61 } 62 if(!stack_empty(a)){ 63 cout<<"棧的大小為: "<<stack_size(a)<<endl; 64 }else{ 65 cout<<"棧為空"<<endl; 66 } 67 if(!stack_empty(a)) 68 pop_stack(a); 69 if(!stack_empty(a)) 70 cout<<"刪除一個元素後,棧頂元素為:"<<get_top(a)<<endl; 71 int SIZE=stack_size(a); 72 cout<<"當前棧的大小為: "<<SIZE<<endl; 73 cout<<"將當前棧中的元素全部彈出:"<<endl; 74 while(!stack_empty(a)){ 75 cout<<get_top(a)<<endl; 76 pop_stack(a); 77 } 78 return 0; 79 }

鏈隊列:c++版

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 struct Node{
 5     int value;
 6     Node *next;
 7 };
 8 Node * build_queue(){ //建立一個空隊列
 9     Node *p=(Node *)malloc(sizeof(Node));
10     if(p==NULL) return p;
11     p->next=NULL;
12     return p;
13 }
14 bool queue_empty(Node *queue_head){ //判斷隊列是否為空
15     if((queue_head->next)==NULL) return true;
16     else return false;
17 }
18 void push_queue(Node * *queue_end,int value){ //將值為value的元素入隊
19     Node *q=*queue_end;
20     Node *p=(Node *)malloc(sizeof(Node));//為新元素開辟空間
21     p->value=value;
22     p->next=NULL;
23     q->next=p;
24     *queue_end=p; //尾指針後移
25 }
26 void pop_queue(Node * queue_head){ //出隊函數
27     Node *p=queue_head;
28     if(queue_empty(queue_head)) return; //判斷隊列是否為空
29     Node *q=p->next->next;
30     p=p->next;
31     free(p);  //釋放出隊元素的存儲空間
32     queue_head->next=q; //頭指針後移
33 }
34 int get_front(Node *queue_head){ //獲取隊首元素的值
35     if(queue_empty(queue_head)==true) return -1; //如果隊列為空,返回-1
36     else return queue_head->next->value;
37 }
38 int main(){
39     Node *queue_head,*queue_end;
40     queue_head=build_queue();
41     queue_end=queue_head; //隊列初始時,隊尾指針和隊首指針指向同一結點
42     if(queue_end==NULL){
43         cout<<"建立隊列失敗!"<<endl;
44         return 0;
45     }
46     else  cout<<"建立隊列成功!第一行輸入一個n表示你要將n個元素入隊,第二行輸入n個元素"<<endl;
47     int n;
48     cin>>n; //輸入一個n表示下一行輸入n個元素
49     for(int i=0;i<n;i++){
50         int x;
51         cin>>x;
52         push_queue(&queue_end,x); //將值為x的元素入隊
53     }
54     cout<<"讓當前隊首元素 X 出隊: X = "<<get_front(queue_head)<<endl;
55     pop_queue(queue_head);
56     cout<<"讓當前隊首元素 X 出隊: X = "<<get_front(queue_head)<<endl;
57     pop_queue(queue_head);
58     cout<<"按順序打印隊列裏面剩余的元素: ";
59     while(queue_head->next!=NULL){
60         cout<<queue_head->next->value<< ;
61         pop_queue(queue_head);
62     }
63     cout<<endl;
64     return 0;
65 }

鏈棧和鏈隊列的建立及基本操作