棧和佇列的基本操作
阿新 • • 發佈:2019-01-28
棧和佇列從某些方面還是比較像的,所以把這兩個合到一起復習
寫一下順序儲存棧和順序儲存佇列的基本操作
#include<iostream> #include<stdlib.h> #define Max 100 using namespace std; typedef struct Stack{ int *base; int *top; int stack_size; }Stack; typedef struct Queue{ int *base; int first; int last; }Queue; void init_stack(Stack &A){ A.base=(int *)malloc(Max*sizeof(int)); A.top=A.base; A.stack_size=Max; } void init_queue(Queue &B){ B.base=(int*)malloc(Max*sizeof(int)); B.first=0; B.last=0; } void free_stack(Stack &exa){ exa.top=NULL; free(exa.base); exa.stack_size=0; } void free_queue(Queue &exa){ free(exa.base); exa.first=exa.last=0; } int check_stack(Stack exa){ //狀態碼:1為空,2為滿,3為其他,下同 if(exa.base == exa.top) return 1; else if(exa.top - exa.base == exa.stack_size) return 2; else return 0; } int check_queue(Queue exa){ if(exa.first==exa.last) return 1; else if( (exa.last+1)%Max == exa.first ) return 2; else return 0; } int pop_stack(Stack &exa){ if(check_stack(exa)!=1){ return *(--exa.top); } else cout<<"棧為空,無法進行出棧操作"<<endl; } void push_stack(Stack &exa, int num){ if(check_stack(exa)!=2){ *(exa.top)=num; exa.top++; } else cout<<"棧已滿,無法進行入棧操作"<<endl; } int pop_queue(Queue &exa){ if(check_queue(exa)!=1){ int temp=*(exa.base+exa.first); exa.first=(++exa.first)%Max; return temp; } else cout<<"佇列為空,無法進行出佇列操作"<<endl; } void push_queue(int num,Queue &exa){ if(check_queue(exa)!=2){ *(exa.base+exa.last)=num; exa.last++; } else cout<<"佇列已滿,無法進行入佇列操作"<<endl; } void show_stack(Stack exa){ int *temp=exa.base; if(check_stack(exa)==1){ cout<<"空"<<endl; return; } while(temp!=exa.top){ cout<< *(temp) <<" "; temp++; } cout<<endl; } void show_queue(Queue exa){ int temp=exa.first; if(check_queue(exa)==1){ cout<<"空"<<endl; return; } while(temp!=exa.last){ cout<< *(exa.base+temp) <<" "; temp=(++temp)%Max; } cout<<endl; } void main_push_stack(Stack &exa){ cout<<"請依次輸入要入棧的元素,以數字999結束"<<endl; int temp; while(1){ cin>>temp; if(temp==999) break; push_stack(exa, temp); } } void main_pop_stack(Stack &exa){ int temp, num; cout<<"請輸入出棧元素個數:"<<endl; cin>>num; cout<<"出棧元素依次為:"; while(num--){ temp=pop_stack(exa); cout<<temp<<" "; } cout<<endl; } void main_push_queue(Queue &exa){ cout<<"請依次輸入要入佇列的元素,以數字999結束"<<endl; int temp; while(1){ cin>>temp; if(temp==999) break; push_queue(temp,exa); } } void main_pop_queue(Queue &exa){ int temp, num; cout<<"請輸入出佇列元素個數:"<<endl; cin>>num; cout<<"出佇列元素依次為:"; while(num--){ temp=pop_queue(exa); cout<<temp<<" "; } cout<<endl; } int main(){ Stack A; init_stack(A); Queue B; init_queue(B); int choose; while(1){ cout<<"**********************"<<endl; cout<<"棧的執行狀態:"; show_stack(A); cout<<"佇列的執行狀態:"; show_queue(B); cout<<"**********************"<<endl; cout<<"請選擇以下操作,輸入序號"<<endl; cout<<"1,入棧"<<endl; cout<<"2,出棧"<<endl; cout<<"3,入佇列"<<endl; cout<<"4,出佇列"<<endl; cout<<"0,退出"<<endl; cin>>choose; switch(choose){ case 1: main_push_stack(A); break; case 2: main_pop_stack(A); break; case 3: main_push_queue(B); break; case 4: main_pop_queue(B); break; default: break; } system("CLS"); } free_stack(A); free_queue(B); return 0; }