用两个栈来模拟出队顺序
栈的出队顺序为FILO
队的出队顺序为FIFO
那么用两个栈来实现队的FIFO顺序如何实现呢?
看代码以及伪代码讲解
#include
#include
#include
#define MAXSIZE 5
typedef struct stack
{
int data[MAXSIZE];
int top;
}S;
bool isEmpty(S *s)
{
if(s->top==-1)
return true;
else
return false;
}
void Push(S *s,int e){
s->data[++s->top]=e;
}
int Pop(S *s){
int e=s->data[s->top--];
return e;
}
/*
//当有元素进入要压栈进入s1时
当s1是满栈的时候
如果s2不是空栈
不可以对s1压栈,否则出队错误
当s2是空栈的时候
把s1的元素全部弹栈压入s2
再把要压入的元素压入s1
s1不是满栈的时候
s2为空
直接将元素压入s1
*/
/*
//当元素要从s2模拟出队的时候
if s2不为空的时候
s2直接弹栈
else
s1为空
总体为空栈
return false
s1有元素的时候
s1全部元素按出栈顺序压入s2
s2再一一弹栈
*/
bool EnQueue(S *s1,S *s2,int x){
if(s1->top==MAXSIZE-1)
{
if(!isEmpty(s2))
return false;
else
{
while(!isEmpty(s1))
{
int element=Pop(s1);
Push(s2,element);
}
Push(s1,x);
return true;
}
}
else
{
Push(s1,x);
return true;
}
}
bool DeQueue(S *s1,S *s2,int number){
if(!isEmpty(s2)){
number=s2->data[s2->top--];
printf("%d\t",number);
return true;
}
else{
if(isEmpty(s1)){
printf("对空,无法输出\n");
return false;
}
else{
while(!isEmpty(s1)){
int element=Pop(s1);
Push(s2,element);
}
number=Pop(s2);
return number;
}
}
}
int main(){
S *s1=(S *)malloc(sizeof(S));
S *s2=(S *)malloc(sizeof(S));
s1->top=-1;
s2->top=-1;
int m=0;
while(m<5){
EnQueue(s1,s2,m++);
}
for(int i=0;i
printf("%d\t",s1->data[i]);
}
int number;
while((s2->top)>=-1)
DeQueue(s1,s2,number);
}
来源:https://www.cnblogs.com/oldfish123/p/12940669.html