zoukankan      html  css  js  c++  java
  • 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);
    }
     
  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/oldfish123/p/12940669.html
Copyright © 2011-2022 走看看