一步两步学算法之循环队列

下面是个循环队列的实例;

循环队列和顺序队列的不同之处 就在于入队的时候 当q->tail==max时 不是判断成队列已满 而是q->tail=1  也就是一个循环了 

用一句代码 来实现   (q->tail+1)%max ==q->head  这样则不会造成假溢出

下面是代码  银行取号系统的实现 很简单 没有写注释

  1 #include "stdio.h"

  2 #include "stdlib.h"

  3 #include "time.h"

  4 #define QUEUEMAX 15

  5 typedef struct

  6 {

  7     int num;    

  8     long time;

  9 }DATA;

 10 typedef struct

 11 {

 12     DATA data[QUEUEMAX];

 13     int head;

 14     int tail;

 15 }CycQueue;

 16 int num;

 17 CycQueue *CycQueueInit()

 18 {

 19     CycQueue *q;

 20     if(q=(CycQueue*)malloc(sizeof(CycQueue)))

 21     {

 22         q->head=0;

 23         q->tail=0;

 24         return q;

 25     }

 26     else

 27         return NULL;

 28 }

 29 

 30 void CycQueueFree(CycQueue *q)

 31 {

 32     if(q!=NULL)

 33         free(q);

 34 }

 35 

 36 int CycQueueIsEmpty(CycQueue *q)

 37 {

 38     return (q->head==q->tail);

 39 }

 40 

 41 int CycQueueIsFull(CycQueue *q)

 42 {

 43     return ((q->tail+1)%QUEUEMAX==q->head);

 44 }

 45 int CycQueueIn(CycQueue *q,DATA data)

 46 {

 47     if((q->tail+1)%QUEUEMAX==q->head)

 48     {

 49         printf("队列已满");

 50         return 0; 

 51     }

 52     else

 53     {

 54         q->tail=(q->tail+1)%QUEUEMAX;

 55         q->data[q->tail]=data;

 56         return 1;

 57     }

 58 }

 59 

 60 DATA *CycQueueOut(CycQueue *q)

 61 {

 62     if(q->head==q->tail)

 63     {

 64         printf("队列为空");

 65         return NULL;

 66     }

 67     else

 68     {

 69         q->head=(q->head+1)%QUEUEMAX;

 70         return &(q->data[q->head]);

 71     }

 72 }

 73 

 74 int CycQueueLen(CycQueue *q)

 75 {

 76     int n;

 77     n=q->tail-q->head;

 78     if(n<0)

 79         n=QUEUEMAX+n;

 80     return n;

 81 }

 82 

 83 DATA *CycQueuePeek(CycQueue *q)

 84 {

 85     if(q->head==q->tail)

 86     {

 87         printf("队列已经为空");

 88     }

 89     else{

 90         return &(q->data[(q->head+1)%QUEUEMAX]);

 91     }

 92 }

 93 

 94 void add(CycQueue *q)

 95 {

 96     DATA data;

 97     if(!CycQueueIsFull(q))

 98     {

 99         data.num=++num;

100         data.time=time(NULL);

101         CycQueueIn(q,data);

102     }

103     else    

104         printf("\n排队的人太多,清稍后再排队!\n"); 

105 } 

106 

107 void next(CycQueue *q)

108 {

109     DATA *data;

110     if(!CycQueueIsEmpty(q))

111     {

112         data=CycQueueOut(q);

113         printf("\n请编号为%d的顾客办理业务!\n",data->num);

114     }

115     if(!CycQueueIsEmpty(q))

116     {

117         data=CycQueuePeek(q);

118         printf("\n请编号为%d的顾客准备!\n",data->num);

119     }

120 }

121 

122 int main()

123 {

124     CycQueue *queue1;

125     int i,n;

126     char select;

127     num=0;

128     queue1=CycQueueInit();

129     if(queue1==NULL)

130     {

131         printf("创建队列时出错!\n");

132         return 0;

133     }

134     do

135     {

136         printf("\n请选择具体操作\n");

137         printf("\n1.新到顾客\n");

138         printf("\n2.下一个顾客\n");

139         printf("\n0.退出\n");

140         fflush(stdin);

141         select=getchar();

142         switch(select)

143         {

144             case '1':

145                 add(queue1);

146                 printf("\n现在共有%d位顾客在等候\n",CycQueueLen(queue1));

147                 break;

148             case '2':

149                 next(queue1);

150                 printf("\n现在共有%d位顾客在等候\n",CycQueueLen(queue1));

151                 break;

152             case '0':

153                 break;

154         }

155     }while(select!='0');

156     CycQueueFree(queue1);

157     return 0;

158 }

 

你可能感兴趣的:(算法)