zoukankan      html  css  js  c++  java
  • 转【c语言】两个堆栈组成一个队列

    假设有两个堆栈,分别是s1,s2,现在有数列“1,2,3,4,5”,要让这个数列实现先进先出的功能,也就是用两个堆栈组成一个队列,如何实现?

    分析:

        先将数列压入栈s1,数列在栈中由顶到底的元素为“5,4,3,2,1”,再将数列压入栈s2,数列在栈中由顶到底的元素为“1,2,3,4,5”,如此出栈,则是“1,2,3,4,5”。

        必须注意,实现队列中的入队操作以及出队操作,并非如同上述操作那么直观。上述操作有一个前提,即两个栈都没有元素。而一般情况,s1和s2中都可能有元素或者没有元素。所以要抽象出更一般的入队以及出队操作。

        入队操作:先将s2中的所有元素出栈,再压入s1中,将要进栈的元素压入s1。

        出队操作:先将s1中的所有元素出栈,再压入s2,再从s2中出栈,则得到将要出队列的元素。

    我的代码,简单实现,未包含所有的队列操作。

    复制代码
    #include <stdio.h>
    #include <stdlib.h>
    
    
    
    typedef struct NODE{
            struct NODE * next;
            int data;
    }node;
    
    
    
    typedef struct STACK{
            node * head;
            int len;
    }stack;
    
    typedef struct QUEUE{
            stack * fstack;
            stack * bstack;
    }queue;
    
    
    stack * init(void){
            stack * List=(stack *) malloc(sizeof(stack));
            List->head=NULL;
            List->len=0;
            return List;
    
    }
    
    int pop(stack *st){
            if(0>=st->len||NULL == st) {
                    printf("NULL stack,leaving now
    ");
                    exit(1);
            }
            int pdata=st->head->data;
            st->head=st->head->next;
            st->len--;
            return pdata;
    }
    
    void push(stack *st, int n){
            if(NULL == st|| 0>st->len){
                    printf("wrong stack,please check the source code, now leaving
    ");
                    exit(1);
            }
            node * pp=(node*)malloc(sizeof(node));
            pp->next=st->head;
            pp->data=n;
            st->head=pp;
            st->len++;
    }
    
    queue * init_queue(void){
            queue * qe=(queue*)malloc(sizeof(queue));
            stack *st1,*st2;
            st1=init();
            st2=init();
            qe->fstack=st1;
            qe->bstack=st2;
            return qe;
    }
    
    int  dequeue(queue * qe){
            int tmp;
    
            if (NULL ==qe ){printf("wrong in queue,now leaving
    ");exit(1);}
            if(0==qe->fstack->len && 0==qe->bstack->len)
            {
                    printf("no element in queue,now leaving 
    ");
                    exit(1);
            }else if( 0==qe->fstack->len){/* qe->bstack->len != 0*/
                    tmp=pop(qe->bstack);
                    return tmp;
            }else{ /* qe->fstack ->len !=0 && qe->bstack->len !=0 */
                    while(qe->fstack->len !=0){
                            tmp=pop(qe->fstack);
                            push(qe->bstack,tmp);
                    }
                    tmp=pop(qe->bstack);
                    return tmp;
            }
    }
    
    void enqueue(queue * qe, int n){
                            int tmp;
            if( NULL == qe ){printf("NULL queue,wrong, now leaving 
    ");exit(1);}
    
            while(qe->bstack->len !=0){
                    tmp=pop(qe->bstack);
                    push(qe->fstack,tmp);
            }
            push(qe->fstack,n);
    }
    
    
    
    int main(){
            queue * qe=init_queue();
    
    #if 1 /* test*/
            int n=5;
            while(n>0){
                    enqueue(qe,n);
                    n--;
            }
            int tmp=dequeue(qe);
            printf("%d
    ",tmp);
            tmp=dequeue(qe);
            printf("%d
    ",tmp);
    #endif
            return 0;
    }
    复制代码
  • 相关阅读:
    以太坊公开拍卖智能合约案例
    部署智能合约
    ERC20 Token
    查看crontab运行状态
    php把excel数值格式转成日期格式
    PHP识别中文编码并自动转换为UTF-8
    python中文件内容替换
    mysqldump备份指定的数据
    linux设置服务器时间
    git常用命令
  • 原文地址:https://www.cnblogs.com/shirishiqi/p/6090171.html
Copyright © 2011-2022 走看看