• 数据结构之线性结构之队列


    三,队列

    队列(操作受限制的线性表):先进先出,一端插入,另一端输出

    队列的顺序存储实现:数组+对头变量+队尾变量

    typedef struct {
        int Data[MAXSIZE];
        int rear;   // rear指向的是真实的数组排序个数,是实际个数-1,front指向第一个数之前的位置
        int front;  //队尾变量rear和对头变量front最初都是指向-1
    }Queue;

    如果是正常的线状队列,前面删除数据部分的空间无法使用,会造成浪费;所有出现循环队列

      循环队列会出现的问题:空满时front==rear都是相等,无法区分

           原因:n种长度值对应n+1种情况

           解决方法:使用额外标记:size或者tag;仅仅使用n-1的数组空间

    void AddQ(Queue *PtrQ, int item)
    {//front 和rear 指针的移动采用“加1取余”法,体现了“循环使用”
        if ((PtrQ->rear + 1) % MAXSIZE == PtrQ->front)
        {
            printf("队列满");
            return;
        }
        PtrQ->rear = (PtrQ->rear + 1) % MAXSIZE;//在队列的尾部插入元素
        PtrQ->Data[PtrQ->rear] = item;
    }
    
    int DeleteQ(Queue *PtrQ)
    {
        if (PtrQ->front == PtrQ->rear)
        {
            printf("队列空");
            return -NAN; 
        }
        else
        {//此处在之前使front加1的原因是front原本指向的是第一个数之前的位置
            PtrQ->front = (PtrQ->front + 1) % MAXSIZE;
            return PtrQ->Data[PtrQ->front];
        }
    }

    队列的链式存储实现:单链表的实现

    typedef struct {
        LinkStack *rear; //指向队尾结点;
        LinkStack *front; //指向对头结点;
    }LinkQueue;

    int DeleteQ(LinkQueue *PtrQ)
    {
        LinkStack *First = new LinkStack;
        int result;
        if (PtrQ->front = NULL)
        {
            printf("队列空");
            return -NAN;
        }
        First = PtrQ->front;
        if (PtrQ->front == PtrQ->rear)
            PtrQ->front = PtrQ->rear = NULL;
        else
        {
            PtrQ->front = PtrQ->front->Next;
        }
        result = First->Data;
        delete(First);
        return result;
    }
  • 相关阅读:
    Chapter 1. 庞加莱群、单粒子态和时间空间反演
    QI Chapter 1
    Introduction to QFT
    在visual studio 2017中配置Qt
    BUAA软工第0次作业
    附加作业(个人)
    个人作业3——个人总结(Alpha阶段)
    单元测试
    英语学习app案例分析
    小学生四则运算改进版之
  • 原文地址:https://www.cnblogs.com/xiaoxue126/p/9041256.html
Copyright © 2020-2023  润新知