轉【c語言】兩個堆棧組成一個隊列

假設有兩個堆棧,分別是s1,s2,如今有數列「1,2,3,4,5」,要讓這個數列實現先進先出的功能,也就是用兩個堆棧組成一個隊列,如何實現?javascript

分析:java

    先將數列壓入棧s1,數列在棧中由頂到底的元素爲「5,4,3,2,1」,再將數列壓入棧s2,數列在棧中由頂到底的元素爲「1,2,3,4,5」,如此出棧,則是「1,2,3,4,5」。node

    必須注意,實現隊列中的入隊操做以及出隊操做,並不是如同上述操做那麼直觀。上述操做有一個前提,即兩個棧都沒有元素。而通常狀況,s1和s2中均可能有元素或者沒有元素。因此要抽象出更通常的入隊以及出隊操做。spa

    入隊操做:先將s2中的全部元素出棧,再壓入s1中,將要進棧的元素壓入s1。code

    出隊操做:先將s1中的全部元素出棧,再壓入s2,再從s2中出棧,則獲得將要出隊列的元素。blog

 

個人代碼,簡單實現,未包含全部的隊列操做。隊列

複製代碼
#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\n"); 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\n"); 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\n");exit(1);} if(0==qe->fstack->len && 0==qe->bstack->len) { printf("no element in queue,now leaving \n"); 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 \n");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\n",tmp); tmp=dequeue(qe); printf("%d\n",tmp); #endif return 0; }
複製代碼
相關文章
相關標籤/搜索