队列

队列的基本运算:置空队列、判空队列、入队列、出队列、取队列头

顺序队列(循环队列)

  • 置空队列

    void InitQueue(CirQueue *Q){
        Q->front=Q->rear=0;
    } 
    
  • 判空队列

    int QueueEmpty(CirQueue *Q){
        return Q->rear==Q->front;
    }
    
  • 判队满

    int QueueFull(CirQueue *Q){
        return (Q->rear+1)%QueueSize==Q->front;
    }
    
  • 入队列

    void EnQueue(CirQueue *Q,DataType x){
        if(QueueFull(Q)){
            prinf("Queue overflow");
        }else{
            Q->data[Q->rear]=x;
            Q->rear=(Q->rear+1)%QueueSize;
        }
    }
    
  • 取队列头

    DataType GetFront(CirQueue *Q){
        if(QueueEmpty(Q)){
            prinf("Queue empty");
        }else{
            return Q->data[Q->front];
        }
    }
    
  • 出队列

    DataType DeQueue(CirQueue *Q){
        DataType x;
        if(QueueEmpty(Q)){
            prinf("Queue empty");
            exit(0);
        }else{
            x=Q->data[Q->front];
            Q->front=(Q->front+1)%QueueSize;
            return x;
        }
    }
    

链队列(带头结点)

  • 构造空队列

    void InitQueue(LinkQueue *Q){
        Q->front=(QueueNode *)malloc(sizeof(QueueNode));
        Q->rear=Q-front;
        Q->rear->next=NULL;
    }
    
  • 判队空

    int QueueEmpty(LinkQueue *Q){
       return Q->rear==Q->front; 
    }
    
  • 入队列

    void EnQueue(LinkQueue *Q){
        QueueNode *p=(QueueNode *)malloc(sizeof(QueueNode));
        p->data=x;
        p->next=NULL;
        Q->rear->next=p;
        Q->rear=p;
    }
    
  • 取队列头元素

    DataType GetFront(LinkQueue *Q){
        if(QueueEmpty(Q)){
            prinf("Queue underflow");
            exit(0);
        }else{
            return Q->front->next->data;
        }
    }
    
  • 出队列

    DataType DeQueue(LinkQueue *Q){
        QueueNode *p;
        if(QueueEmpty(Q)){
            prinf("Queue underflow");
            exit(0);
        }else{
            p=Q->front;
            Q->front=Q->front->next;
            free(p);
            return(Q->front->data);
        }
    }
    
原文地址:https://www.cnblogs.com/snail-gao/p/11739721.html