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;
}

 

posted @ 2019-05-03 20:32  aascn  阅读(126)  评论(0编辑  收藏  举报