鏈棧和鏈隊列的建立及基本操作
阿新 • • 發佈:2018-05-09
是否為空 數據類型 數據 == 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 }
鏈棧和鏈隊列的建立及基本操作