棧和隊列從某些方面還是比較像的,所以把這兩個合到一起復習
寫一下順序存儲棧和順序存儲隊列的基本操作
#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;
}