栈和队列从某些方面还是比较像的,所以把这两个合到一起复习
写一下顺序存储栈和顺序存储队列的基本操作
#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;
}