数据结构系列(四)-队列

本篇介绍数据结构-队列

思维导图

数据结构系列(四)-队列

队列

  • 定义

      是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
    
  • 属性

    • 允许删除的一端称为 队头(Front),允许插入的一端称为 队尾(Rear)
    • 当队列中没有元素时称为空队列
    • 队列称作先进先出(First In First Out)的线性表,简称为FIFO
  • 顺序队列-基本运算

    数据结构系列(四)-队列

    • 置空队列
    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)){ //出错退出处理
            printf("Queue overflow");
        }else{
            Q->data[Q->rear]=x;
            Q->rear=(Q->rear+1) % QueueSize; //循环意义下的加1
        }
    }
    
    • 取队头元素
    DataType GetFront(CirQueue *Q){
        if(QueueEmpty(Q)){ //出错退出处理
            printf("Queue empty");
            exit(0);
        }else{
            return Q->data[Q->front]; //返回队头元素值
        }
    }
    
    • 出队列
    DataType DeQueue(CirQueue *Q){
        DataType x;
        if(QueueEmpty(Q)){ //出错退出处理
            printf("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 , DataType x){
        QueueNode *p->(QueueNode *)malloc(sizeof(QueueNode));
        p->data=x;
        p->next=NULL;
        Q->rear->next=p; //*p 链到原队尾结点之后
        Q->rear=p; //队尾指针指向新的队尾结点
    }
    
    • 取队头元素
    DataType GetFront(LinkQueue *Q){
        if(QueueEmpty(Q)){ //出错退出处理
            printf("Queue underflow");
            exit(0);
        }else{
            return Q->front->next->data; //返回原队头元素值
        }
    }
    
    • 出队列
    DataType DeQueue(LinkQueue *Q){
        QueueNode *p;
        if(QueueEmpty(Q)){ //出错退出处理
            printf("Queue underflow");
            exit(0);
        }else{
            p->Q->front; //p指向头结点
            Q->front=Q->front->next; //头指针指向原队头结点
            free(p);//删除释放原头结点
            return Q->front->data; //返回原队头结点的数据值
        }
    }
    
上一篇:[C++]数据结构:栈之顺序栈


下一篇:.Net Core 实践 - 使用log4net记录日志(1)