• 数据结构学习(四)、队列


    队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。线性表分为顺序存储和链式存储,栈是线性表,

    所以也有这两种存储方式。同样,队列作为一种特殊的线性表,也同样存在这两种存储方式。我们先来看队列的顺序存储结构。

    * 循环队列的顺序存储结构 */
    typedef struct
    {
        ElemType data[MAXSIZE];
        int front; /*头指针*/
        int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */
    }SqQueue;

    顺序队列初始化

    顺序队列初始化,就是把队头和队尾都归0,也就是 Q->front=0; Q->rear=0;

    /*
      初始化一个空队列Q 
      @params Q 队列指针
    */
    int InitQueue(SqQueue *Q)
    {
        Q->front = 0;
        Q->rear  = 0;
        return OK;
    }

    顺序队列入队

    顺序队列入队操作,最开始需要判断队列是否满了,未满则先给队尾元素赋值,然后再将队尾指针向后移动一位,若到最后则转到数组头部

    /*
        未满队列插入操作
        @params Q 队列指针
        @params e 插入元素
    */
    Status EnQueue(SqQueue *Q,ElemType e)
    {
        if((Q->rear+1)%MAXSIZE == Q->front)
            return ERROR;
        Q->data[Q->rear] = e;
        Q->rear = (Q->rear+1)%MAXSIZE;
        return OK;
    }

    顺序队列出队

    顺序队列出队操作,最开始需要判断队列是否为空了,不为空则先给队头元素赋值给e,然后再将队头向后移一位,若到最后则转到数组头部

    /*
         未空队列出栈操作
         @params Q 队列指针
         @params e 接收出队数据指针
    */
    Status DeQueue(SqQueue *Q,ElemType *e)
    {
        if(Q->rear == Q->front)
            return ERROR;
        *e = Q->data[Q->front];
        Q->front = (Q->front+1)%MAXSIZE;
        return OK;
    }    

     顺序队列就讲到这里,接下来我们先来看队列的链式存储结构,队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。。

    /* 结点结构 */
    typedef struct Node
    {
        ElemType data;
        struct Node * next;
    }Node,*QueueNode;
    /* 队列的链表结构 */
    typedef struct
    {
        QueueNode front;
        QueueNode rear;
        int length;
    }QueueList;

    链式队列初始化

    链式队列初始化,先产生一个头结点,然后让头结点指向NULL,再分别让队列的头尾指向头结点;

    /*
        初始化链式队列
        @params Q 队列指针
    */
    Status InitQueue(QueueList *Q){
        QueueNode head;
        head = (QueueNode)malloc(sizeof(Node));
        if(!head)
            return ERROR;
        head->next = NULL;
        Q->front = head;
        Q->rear  = head;
        return OK;
    }

    链式队列入队操作

    链式队列入队操作,先产生一个结点,让该结点指向NULL,再让队列的尾结点指向该结点,最后将该结点赋值给尾结点,队列计数加一

    /*
        入队操作
         @params Q 队列指针
         @params e 入队元素
    */
    Status EnQueue(QueueList *Q,ElemType e)
    {
       QueueNode n,t;
       n = (QueueNode)malloc(sizeof(Node));
       if(!n)
         return ERROR;
       n->data = e;
       n->next = NULL;
       Q->rear->next = n;
       Q->rear = n;
       Q->length ++;
       return OK;
    }

    链式队列出队操作

    链式队列出队操作,先判断是否为空队列,不为空队列,将第一结点值赋给e,头结点指向第一结点的下一结点,释放头结点,队列计数减一

    /*
       出队操作
        @params Q 队列指针
        @params e 接收对象指针
    */
    Status DeQueue(QueueList *Q,ElemType *e)
    {
        QueueNode n;
        if(Q->rear == Q->front)
            return ERROR;
        n = Q->front->next;
        *e = n->data;
        Q->front->next = n->next;
        free(n);
        Q->length --;
        return OK;
    }
  • 相关阅读:
    Maven配置阿里云镜像
    docker启动报错 error creating overlay mount
    docker 运行jenkins容器
    centos7 安装docker
    Create PropertyManager Page Example (VB.NET)
    Solidworks api帮助代码报错 “特性说明符不是一个完整的语句。请使用行继续符将该特性应用于下列语句。“的解决办法!
    Solidworks API中在一个拉伸的矩形的前后面建立两个基准面的代码示例
    用vb.net运行一个应用程序,以solidworks为例
    solidworks二次开发中直接录出来的VB代码拿到自己建的项目里出现“未设置对象变量或with块变量”解决办法!
    visual studio xamarin 离线安装文件以及 android 模拟器
  • 原文地址:https://www.cnblogs.com/huixuexidezhu/p/5899830.html
Copyright © 2020-2023  润新知