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);
    }
     
  • 相关阅读:
    梦断代码阅读笔记03
    第十二周进度条
    找“水王”
    梦断代码阅读笔记02
    梦断代码阅读笔记01
    团队开发第二阶段个人博客(2)
    团队开发第二阶段个人博客(1)
    个人总结
    第16周学习进度条
    个人进度条第15周
  • 原文地址:https://www.cnblogs.com/oldfish123/p/12940669.html
Copyright © 2011-2022 走看看