兩個棧實現一個隊列,C語言實現,隊列可伸縮,容納任意數目的元素。

1、思路:一、建立兩個空棧A和B;二、A棧做爲隊列的入口,B棧做爲隊列的出口;三、入隊列操做:便是入棧A;四、出隊列操做:若棧B爲空,則將A棧內容出棧並壓人B棧,再出      B棧;不爲空就直接出棧;數據結構

2、代碼:函數

  一、頭文件:stack_to_queue.h:封裝了:隊列、棧的數據結構和各類操做的函數。測試

  1 #ifndef STACK_TO_QUEUE_H
  2 #define STACK_TO_QUEUE_H
  3 
  4 #include<stdio.h>
  5 #include<stdlib.h>
  6 
  7 #define ALLOC_SIZE 512
  8 #define ElemType int
  9 
 10 typedef struct sqstack
 11 {
 12     ElemType *top;          //棧頂指針
 13     ElemType *base;         //棧底指針
 14     int stack_size;    //棧目前能存儲的元素數目
 15 }SqStack;                //順序棧
 16 
 17 typedef struct sqqueue
 18 {
 19     SqStack front;          //隊列頭,出口,
 20     SqStack rear;           //隊列尾,入口
 21 }SqQueue;
 22 
 23 /*棧的初始化函數*/
 24 void InitStack(SqStack *s)
 25 {
 26     if((s->top=(ElemType*)malloc(ALLOC_SIZE*sizeof(ElemType)))==NULL)
 27     {
 28         printf("stack malloc error\n");
 29         exit(1);
 30     }
 31     s->base=s->top;
 32     s->stack_size=ALLOC_SIZE;
 33 }
 34 
 35 /*出棧函數,棧爲空時返回0,成功出棧時返回1*/
 36 int pop_stack(SqStack *s,ElemType *data)
 37 {
 38     if(s->top!=s->base)
 39     {
 40         s->top--;
 41         *data=*s->top;
 42         return 1;
 43     }
 44     else                    //返回值爲0,表示棧爲空
 45     {
 46         return 0;
 47     }
 48 }
 49 
 50 /*入棧函數*/
 51 void push_stack(SqStack *s,ElemType data)
 52 {
 53     if((s->top-s->base)>=s->stack_size)
 54     {
 55         if((s->base=(ElemType *)realloc(s->base,(s->stack_size+ALLOC_SIZE)*sizeof(ElemType)))==NULL)
 56         {
 57             printf("stack realloc error\n");
 58             exit(1);
 59         }
 60         else
 61         {
 62             s->top=s->base+s->stack_size;
 63             s->stack_size+=ALLOC_SIZE;
 64         }
 65     }
 66     *(s->top)=data;
 67     s->top++;
 68 }
 69 
 70 /*隊列初始化函數*/
 71 void InitQueue(SqQueue *q)
 72 {
 73     SqStack A,B;
 74 
 75     InitStack(&A);
 76     InitStack(&B);
 77     q->front=B;        //將棧B做爲隊列的出口
 78     q->rear=A;         //將棧A做爲隊列的入口
 79 }
 80 
 81 /*入隊列函數*/
 82 void push_queue(SqQueue *q,ElemType data)
 83 {
 84     push_stack(&q->rear,data);
 85 }
 86 
 87 /*出隊列函數,隊列爲空時返回0,成功出隊列返回1*/
 88 int pop_queue(SqQueue *q,ElemType *data)
 89 {
 90     if((pop_stack(&q->front,data))==0)       //若是做爲出口的棧爲空,就將入口棧的內容壓入
 91     {
 92         while((pop_stack(&q->rear,data))!=0)
 93         {
 94             push_stack(&q->front,*data);
 95         }
 96     }
 97     else        //不然,返回1
 98     {
 99         return 1;
100     }
101     if((pop_stack(&q->front,data))==0)       //若是將入口棧的內容壓人後還爲空,說明此時隊列爲空
102     {
103         return 0;
104     }
105     else
106     {
107         return 1;
108     }
109 }
110 #endif

二、主函數:main.c:只爲測試用,經過for循環讓1000個數0-999入隊列,再打印。spa

 1 #include<stdio.h>
 2 #include"stack_to_queue.h"
 3 
 4 int main()
 5 {
 6     SqQueue q;
 7     int i,data;
 8 
 9     InitQueue(&q);
10     for(i=0;i<1000;i++)
11     {
12         push_queue(&q,i);
13     }
14     while((pop_queue(&q,&data))!=0)
15     {
16         printf("%d  ",data);
17     }
18 
19     return 0;
20 }

以前寫的時候犯了一個錯誤,在stack_to_queue.h中的62行,使用realloc函數從新分配內存後,要將top指針也指向新的位置,我漏掉了這一步,致使出錯,檢查了好久,最後的解決過程在這:http://q.cnblogs.com/q/54337/指針

相關文章
相關標籤/搜索