3.1 队列-顺序存储
// 队列的顺序存储 // 队空:front=rear=0 // 入队:rear+1 // 出队:front+1 // 该数组无头元素,出队入队都向上。 // 会产生假溢出,即rear=MAXSIZE且元素未填满队列时。 // 如何判断真正的上溢出?rear=MAXSIZE & rear!=0 // 扩展:区分真假溢出,如果是假溢出,可以reset一下。 // 但是如果数据量大,reset或不能达到很好的性能 /* 左front 右rear */ #include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 #define NONE 1e8 //一个元素也没有的时候,front和rear置为None typedef struct queue{ int data[MAXSIZE]; int front,rear; }Queue; void initQueue(Queue *Q){ Q->front=Q->rear=NONE; } int isFull(Queue *Q){ if(Q->rear < MAXSIZE | Q->rear==NONE) return 0; // 未溢出 return Q->front == 0 ? 1:-1; // 真溢出、假上溢 } // 同样,front==rear时可能为空也可能不为空,空的时候设置front=rear=1e9 int isEmpty(Queue *Q){ return Q->rear==NONE ? 1:0; // 1 未空、剩一个都可出队 } int enQueue(Queue *Q,int e){ if(isFull(Q)) return 0; if(isEmpty(Q)){ // 空队的时候特殊处理 Q->front=Q->rear=0; Q->data[0]=e; } else { Q->rear++; Q->data[Q->rear]=e; // 先+1后入队 } return 1; } int deQueue(Queue *Q,int *e){ if(isEmpty(Q)){ puts("Empty!"); return 0; // 先排除是空队的情况 } if(Q->front==Q->rear){ // 如果出队的是最后一个元素,则front不用+1,此时front、rear归零 *e=Q->data[Q->front]; Q->front=Q->rear=NONE; } else *e=Q->data[Q->front++]; return 1; } void disp(Queue Q){ int idx=Q.front; if(idx==NONE) { puts("none can be display!"); return; } while(idx<=Q.rear){ printf("%d ",Q.data[idx++]); } printf("\n"); } int main(){ Queue Q; initQueue(&Q); for(int i = 0; i<3 ; i++){ enQueue(&Q,i); } disp(Q); int e; deQueue(&Q,&e); printf("%d ",e); deQueue(&Q,&e); deQueue(&Q,&e); printf("%d \n",e); disp(Q); return 0; }