C语言 双栈模拟出队

用两个栈来模拟出队顺序

栈的出队顺序为FILO

队的出队顺序为FIFO

那么用两个栈来实现队的FIFO顺序如何实现呢?

看代码以及伪代码讲解

#include<stdio.h>
#include<stdlib.h> 
#include<stdbool.h>
#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	",number);
        return true;
    }
    else{
        if(isEmpty(s1)){
            printf("对空,无法输出
");
            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<MAXSIZE;i++){
        printf("%d	",s1->data[i]);
    }
    int number;
    while((s2->top)>=-1)
        DeQueue(s1,s2,number);
}
 
原文地址:https://www.cnblogs.com/oldfish123/p/12940669.html