首页 > 其他分享 >数据结构基础篇(6)

数据结构基础篇(6)

时间:2024-06-05 23:59:45浏览次数:31  
标签:MAXQSIZE 队列 基础 base front return 数据结构 rear

二十三、队列的表示和操作的实现

  • 相关术语
    • 队列是仅在表尾进行插入操作,在表头进行删除操作的线性表
    • 表尾既a~n段,称对尾;表头a~1段,称队头
    • 它是一种先进先出(FIFO)的线性表
      • 入队:插入元素
      • 出队:删除元素
    • 队列的存储结构为链对或顺序对(常用循环顺序队)
  • 队列的常见应用
    • 脱机打印输出:按申请的先后顺序依次输出
    • 多用户系统中,多个用户排成队,分时循环使用cpu和主存
    • 按用户的优先级排成多个队,每个优先级一个队列
    • 实时控制系统中,信号按接收的先后顺序依次处理
    • 网络电文传输,按到达的时间先后顺序依次进行

队列的顺序表示和实现

  • 队列的物理存储可以用顺序存储结构,链式存储结构,队列的存储方式有两种,顺序队列和链式队列
  • 队列的顺序表示——用一维数组base[MAXQSIZE]
#define MAXQSIZE 100    //最大队列长度
Typedef struct
{
    QElemType *base;    //初始化的动态分配存储空间
    int front;    //头指针
    int rear;    //尾指针
}SqQueue;
  • 队列问题
    • 若数组大小为MAXQSIZE
      • rear=MAXQSIZE,发生溢出
      • front=0,rear=MAXQSIZE,再入队——真溢出
      • front=-,rear=MAXQSIEZE,在入队——假溢出
    • 解决假上溢方法
      • 将队中元素依次相对头方向移动
        • 缺点
          • 浪费时间,每移动依次,对中元素都要移动
  • 引用循环队列
    • 将对空间想象成一个循环的标,分配给队列m个存储单元循环使用,当rear是maxqsize时,向量的开始端空着,从头使用空着的空间,front为maxqsize,一样
    • base[0]接在base[MAXQSIZE-1]后,若rear+1==M,令rear=0;
    • 利用模运算(mod,求余)
      • 插入元素
        • Q.base[Q.rear]=x
        • Q.rear=(Q.rear+1)%MAXQSIZE
      • 删除元素
        • x=Q.base[s.front]
        • Q.front=(Q.front+1)%MAXQSIZE
    • 出现队空堆满都是front==rear
      • 解决方案
        • 再设一个标志区别
        • 再设一个变量,记录元素个数
        • 少用一个元素空间
          • 队空:front==rear
          • 队满:(rear+1)%MAXQSIZE==front
  • 循环队列类型定义
    • 队列初始化
Status InitQueue(SqQueue &Q)
{
    Q.base=new QElemType[MAXQSIZE]    //分配数组空间    //Q.base=(QElemType *) malloc(MAXQSIZE*sizeof(QElemType));
    if(!Q.base)
        exit(OVERFLOW);    //存储分配失败
    Q.front=Q.rear=0;    //头指针尾指针为0,队列为空
    return OK;
}

- 求循环队列长度

int QueueLength(SqQueue Q)
{
    return((Q.rear-Q.front+MAXQSIZE)%MAXQSIZE);
}

- 循环队列入队

Status EnQueue(SqQueue &Q,QElemType e)
{
    if((Q.rear+!)%MAXQSIZE==Q.front)
        return ERROR;    //判断是否队满
    Q.base[Q.rear]=e;    //新元素加入队尾
    Q.rear=(Q.rear+1)%MAXQSIZE;    //队尾指针+1
    return OK;
}

- 循环队列出队

Status DeQueue(SqQueue &Q,QElemType &e)
{
    if(Q.front==Q.rear)
        reutn ERROR;    //对空
    e=Q.base[Q.front];    //保存队头元素
    Q.front=(Q.front+1)%MAXQSIZE    //队头指针+1
    return OK;
}

- 取队头元素

SElemType GetHead(SqQuere Q)
{
    if(Q.front!=Q.rear)
        return Q.base[Q.front];    //返回指针元素的值,队头指针不变
}
  • 队列的链式存储结构
    • 用户无法估计所用队列长度,采用链队列
  • 链队列的类型定义
#define MAXQSIZE 100    //最大队列长度
typedef struct Qnode
{
    QElemType data;
    stuct Qnode *next;
}QNode,*QuenePtr;

- 链队列初始化

Status InitQueue(LinkQueue &Q)
{
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
    if(!Q.front)
        exit(OVERFLOW);
    Q.front->next=NULL;
    reutrn OK;
}

- 销毁队列

Status DestroyQueue(LinkQueue &Q)
{
        while(Q.front)
        {
            p=Q.front->next;
            free(Q.front);
            Q.front=p        
        }    
    return OK;
}

- 链队列元素入队

Status EnQueue(LinkQueue &Q,QElemType e)
{
    p=(QueuePtr)malloc(sizeof(QNode));
    if(!p)
        exit(OVERFLOW);
    p->data=e;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return OK;
}

- 链队列元素出队

Status DeQueue(LinkQueue &Q,QElemType &e)
{
    if(Q.front==Q.rear)
        return ERROR;
    p=Q.front->next;
    e=p->data;
    Q.front->next=p->next;
    if(Q.rear==p)
        Q.rear=Q.front;
    delete p;
    return OK;
}

- 链队列的类型定义

#define MAXQSIZE 100    //最大队列长度
typedef struct Qnode
{
    QElemType data;
    stuct Qnode *next;
}QNode,*QuenePtr;

标签:MAXQSIZE,队列,基础,base,front,return,数据结构,rear
From: https://blog.csdn.net/weixin_53314015/article/details/139381131

相关文章

  • (十六)统计学基础练习题十(选择题T451-478)
    本文整理了统计学基础知识相关的练习题,共50道,适用于想巩固统计学基础或备考的同学。来源:如荷学数据科学题库(技术专项-统计学三)。序号之前的题请看往期文章。451)452)453)454)455)456)457)458)459)460)461)462)463)464)465)466)467)468)469)470)471)472)......
  • uniapp-two-day-two之基础内容and滑动组件和滚动栏
    基础内容又是码农无聊的一天,今天也就上了一节早课,下课想学习的服了结果玩了半天手机,终于是在下午学上了,真的是很难控制自己。闲聊结束。text标签text中有上面这几个属性,其中在我看来selectable是挺重要的一个属性,是吧现在不都说是cv工程师吗?可不就是这个来组成了我们工程师......
  • C语言数据结构实现-单链表表基本操作
    链表插入元素同顺序表一样,向链表中增添元素,根据添加位置不同,可分为以下3种情况:插入到链表的头部(头节点之后),作为首元节点;插入到链表中间的某个位置;插入到链表的最末端,作为链表中最后一个数据元素;虽然新元素的插入位置不固定,但是链表插入元素的思想是固定的,只需做以下两步操......
  • LLM的基础模型5:Embedding模型
    大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模型领域最新技术跟踪。若对于具身智能感兴趣的请移步具身......
  • Linux基础 (十四):socket网络编程
         我们用户是处在应用层的,根据不同的场景和业务需求,传输层就要为我们应用层提供不同的传输协议,常见的就是TCP协议和UDP协议,二者各自有不同的特点,网络中的数据的传输其实就是两个进程间的通信,两个进程在通信时,传输层使用TCP协议将一方进程的应用层的数据传输给另一......
  • Linux基础 (十三):计算机网络基础概论
    一、网络基本概念1.1网络    把独立自主的计算机通过传输介质和网络设备链接起来,就构成一个网络,网络是由若干结点和连接这些结点的链路组成,网络中的结点可以是计算机,交换机、路由器等设备。网络设备有:交换机、路由器、集线器传输介质有:双绞线、同轴电缆、光纤......
  • Studying-代码随想录算法训练营day1| 数组理论基础,704二分查找,27.移除元素
    第一天......
  • Flask Web开发基础:数据库与ORM实战
    FlaskWeb开发基础:数据库与ORM实战该文介绍了如何使用Flask、SQLAlchemy和SQLite实现数据库操作。首先,通过创建虚拟环境和安装flask-sqlalchemy(版本2.5.1)及sqlalchemy(版本1.4.47)来设置环境。接着,配置数据库URI,定义User和Movie模型类表示数据库表,并通过db.create_all......
  • 基于c语言的UDP客户端、服务端二合一基础代码
    基于c语言的UDP客户端、服务端二合一基础代码示意图:准备好了吗,以下是基础代码:/****************************************************************************************************************************************字节序:数据以字节流的方式进行传输,底层都是......
  • 基于c语言的TCP客户端、服务端基础代码
    基于c语言的TCP客户端、服务端基础代码基本流程:客户端:#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdio.h>#include<errno.h>#include<sys/socket.h>#include<netinet/in.h>#include<netinet/......