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

三,队列

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

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

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

 

posted @ 2018-05-15 15:37  小雪SS  阅读(726)  评论(0编辑  收藏  举报