zoukankan      html  css  js  c++  java
  • 第三章:4.栈和队列 -- 单链队列的表示及实现

    前言:

      我们生活中排队模型的特点是,最早进入队伍的元素最早离开。本节提出队列来描述类似排队的结构模型。

    目录:

      1、栈

      2、栈的应用举例

      3、栈与递归的实现

      4、队列

      5、离散事件模型

    正文:

      队列的定义:

        和栈相反,队列(queue)是一种先进先出(first in first out, FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端就做队尾(rear),允许删除的一端称为队头(front)。

      双端队列:

        双端队列是限定插入和删除操作在表的两端进行的线性表。(一种限制性的数据结构)

      队列的链式表示和实现:

        用链表表示的队列简称为 链队列 。一个链队列显然需要两个分别指向队头 和 队尾 的指针(分别称为头指针 和 尾指针)。这里和单链表一样,为了方便也给队列添加一个头结点。

      

      队列示意图:

            

      单链队列的存储结构:

        //结点定义
        typedef struct QNode{
            ElemType data;                //单链表中结点的数据域
            struct QNode *next;            //结点的指针域
        }QNode;

        //队列链定义
        typedef struct{
            QNode *front;                //队头指针
            QNode *rare;                //队尾指针
        }LinkQueue;

      代码实现:

       

    #include<stdio.h>
    #include<stdlib.h>
    
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    //Status是函数的类型,其值是函数结果状态码
    typedef int Status;
    
    typedef int ElemType;
    
    //结点定义
    typedef struct QNode{
        ElemType data;                //单链表中结点的数据域
        struct QNode *next;            //结点的指针域
    }QNode;
    
    //队列链定义
    typedef struct{
        QNode *front;                //队头指针
        QNode *rare;                //队尾指针
    }LinkQueue;
    
    //初始化一个空队列
    Status InitQueue(LinkQueue &Q){
        Q.front=Q.rare=(QNode *)malloc(sizeof(QNode));
        if(!Q.front) exit(OVERFLOW);
        Q.front->next=NULL;
        return OK;
    }
    
    //判断是否为空队列
    Status QueueEmpty(LinkQueue &Q){
        if(Q.front==Q.rare)
            return TRUE;
        return FALSE;
    }
    
    //判断长度
    Status QueueLength(LinkQueue &Q){
        if(Q.front==Q.rare)
            return 0;
        int i=0;
        QNode *q=Q.front;
        while(q->next){
            q=q->next;
            i++;
        }
        return i;
    }
    
    
    //向队列尾部插入元素e
    Status EnQueue(LinkQueue &Q,ElemType e){
        //生成 结点
        QNode *q;                        //指向新生成的结点
        q=(QNode *)malloc(sizeof(QNode));
        if(!q) exit(OVERFLOW);
        q->data=e;
        q->next=NULL;
    
        Q.rare->next=q;
        Q.rare=q;
        return OK;
    }
    
    //删除队列头部元素并返回
    Status DeQueue(LinkQueue &Q,ElemType &e){
        if(Q.front==Q.rare) return ERROR;
        QNode *q=Q.front->next;
        e=Q.front->next->data;
        Q.front->next=Q.front->next->next;
        if(!Q.front->next)
            Q.rare=Q.front;
        free(q);
        return OK;
    }
    
    void printV(LinkQueue &Q){
        if(Q.front==Q.rare) 
            printf("%s
    ","空队列");
        QNode *q=Q.front;
        while(q->next){
            printf("地址:%p",q->next);
            printf("值:%d
    ",q->next->data);
            q=q->next;
        }
    }
    
    void main(){
        LinkQueue Q;
        InitQueue(Q);
        EnQueue(Q,1);
        EnQueue(Q,2);
        EnQueue(Q,3);
        EnQueue(Q,4);
    
        printV(Q);
        ElemType e;
    
        //删除队列
        DeQueue(Q,e);
        printf("
    %s
    ","从队头删除一个元素后");
        printV(Q);
    
        printf("
    length:%d
    ",QueueLength(Q));
    }

      

      运行结果:

      

      

  • 相关阅读:
    使用DBCP时发生AbstractMethodError异常
    Android NDK 环境搭建 + 测试例程
    一个关于含有显式实参的虚函数调用问题解释
    cookie和session
    hello
    python 多线程多进程
    python 网络编程
    docker 制作镜像
    docker 数据卷存储
    docker 简单原理及相关命令(镜像拉取 删除 执行容器 进入容器)
  • 原文地址:https://www.cnblogs.com/ahguSH/p/6203478.html
Copyright © 2011-2022 走看看