zoukankan      html  css  js  c++  java
  • 队列的链式存储结构

    1 链队列的存储结构

      将对头指针front指向链队列的头结点,队尾指针rear指向终端结点。

      空队列时,头指针front和尾指针rear都指向头结点。

      链队列的存储结构为:

    typedef int QElemType;
    typedef struct QNode {            //结点结构
        QElemType data;
        struct QNode *next;
    }QNode;
    
    typedef struct QNode * QueuePtr;
    
    typedef struct {                //队列的链表结构
        QueuePtr rear;
        QueuePtr front;
    }LinkQueue;

    2 入队操作

    //插入元素e为Q的新的队尾结点
    Status EnQueue(QueuePtr Q, QElemType e) {
        QueuePtr q = (QueuePtr)malloc(sizeof(QNode));
        if (!q) {                //存储分配失败
            exit(OVERFLOW);
        }
        q->data = e;
        q->next = NULL;
        Q->rear->next = q;
        Q->rear = q;
        return OK;
    }

    3 出队操作

      出队操作,就是头结点的后继结点出队,将头结点的后继改为它后面的结点。

      若链表除头结点外只剩一个元素时,则需将rear指针指向头结点。

    //若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR。
    Status DeQueue(QueuePtr Q, QElemType *e) {
        QueuePtr q;
        if (Q->rear == Q->front) {        //空队列
            return ERROR;
        }
        q = Q->front->next;                //q指向第一个结点
        *e = q->data;
        Q->front->next = q->next;
    
        if (Q->rear == p) {                //若队头就是队尾,删除后,需要将rear指针指向头结点
            Q->rear = Q->front;
        }
        free(q);
        return OK;
    }

    4 循环队列与链队列的比较

      从时间上考虑,循环队列和链队列的基本操作都是O(1),不过循环队列是事先已申请好空间,使用期间不会释放。而对于链队列,每次申请和释放结点也会存在一些时间开销。如果入队和出队频繁,两者还是有细微差异的。
      从空间来说,循环队列必须有一个固定的长度,所以就有了存储元素个数和空间浪费的问题。而链队列不存在这个问题,尽管它需要一个指针域,会产生一些空间上的开销,但是是可以接受的。所以从空间上说,链队列更加灵活。
      总的来说,在可以确定链队列最大长度的情况下,建议使用循环队列。如果无法预估队列的长度,则使用链队列。

  • 相关阅读:
    CodeForces 710CMagic Odd Square(经典-奇数个奇数&偶数个偶数)
    CodeForces 710A King Moves(水题-越界问题)
    CodeForces 701C They Are Everywhere (滑动窗口)
    CodeForces 701B Cells Not Under Attack
    [补档]happiness
    [补档]王者之剑
    [补档]士兵占领
    [补档]搭配飞行员
    [补档]暑假集训D6总结
    [补档][Lydsy2017年4月月赛]抵制克苏恩
  • 原文地址:https://www.cnblogs.com/muzijie/p/5655228.html
Copyright © 2011-2022 走看看