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

本篇介绍数据结构-队列

思维导图

队列

  • 定义

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

    • 允许删除的一端称为 队头(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; //返回原队头结点的数据值
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值