首页 > 其他分享 >3.8 队列的顺序表示和实现

3.8 队列的顺序表示和实现

时间:2023-03-18 21:22:57浏览次数:36  
标签:顺序 队列 length base 3.8 front rear 指针

3.5.2 队列的顺序表示和实现


  • 队列的物理存储可以用顺序结构,也可用链式存储结构,相应地队列的存储方式也分为两种,即顺序队列和链式队列、

  • 队列的顺序表示——————用一维数组base[MAXQSIZE]

    #define MAXQSIZE  100 // 最大队列的长度
    typedef  struct{
      	QElemType* base;   // 初始化的动态分配存储空间
      	int  front;        // 头指针
      	int  rear;			  //  尾指针
      	int  length;			//  用来记录队列所存储的元素个数 
    }SqQueue;
    
  • 为什么需要使用循环队列?

    • 因为会发生上溢的情况下,会导致空间利用率不高,所以使用循环队列使空间利用率提高。所以我可以都上面的队列结构中指针进行修改,对队列中两个指针进行下标循环,即可解决问题。
  • 解决思路

    • 将队空间设想成一个循环的表,即分配给队列的m个存储单元可以循环使用,当rear为maxqsize时,若向量的开始的端空着,又可以从头使用空着的空间。当front为maxqsize时,也一样。这两个操作主要体现在入队和出队的操作当中。
    • 这里需要注意的是,就是两个指针的循环是利用mod运算来是实现。
    • 还有就是如何来表示队空和队满的情况,自己使用的是另外设置一个变量来进行记录队列的长度

初始化队列

  • 【算法思想】初始情况下,front=rear=0,也就是说头指针和尾指针指向同一位置

  • 【算法描述】

    Status InitQueue(&Q){
      	 Q.base=new QElemType[MAXQSIZE];   // 分配空间
      //Q.base=(QElemType)malloc(sizeof(QElemType));
      	 if(!Q.base)										 //  判断是否分配成功
           	exit(OVERFLOW);
      	 Q.rear=Q.base=0;
      	 Q.length=0;
    }
    

求队列的长度

  • 【算法描述】

    int  QueueLength(Q){
      	return Q.length;
    }
    

循环队列入队操作

  • 【算法思想】入队操作是在队尾进行操作。

  • 【算法步骤】
    1、首先是需要判断队列是否已满,然后进行插入操作
    2、front指针所指向的位置空间进行赋值,值为参数所传递进来的值。
    3、将front指针进行移动一位,并且将length进行加一即可。

  • 【算法描述】

    Status EnQueue(&Q,e){
      if(Q.Length==MAXQSIZE){
        	return  ERROR;
      }
      Q.base[Q.front]=e;
      Q.front=(Q.front+1)%MAXQSIZE;
      Q.length++;
      return OK;
    }
    

循环队列出队操作

  • 【算法思想】出队操作是在队头进行操作

  • 【算法步骤】
    1、首先是判断队列是否为空,然后进行下面的操作。
    2、将rear指针所指向的位置元素进行删除
    3、将rear指针进行移动一位,并且将length减一即可。

  • 【算法描述】

     Status DeQueue(&Q,&e){
       	if(Q.length==0){
          	return ERROR;
        }
       	e=Q.base[Q.rear];
       	Q.rear=(Q.rear+1)%MAXQSIZE;
        Q.length++;
      	return OK; 
     }
    

取队头元素

  • 【算法描述】

    SElemType GetHead(SqQueue Q){
      	// 首先是判断队列是否为空
      	if(Q.length==0){
          	return ERROR;
        }
      	return Q.base[Q.front];
    }
    

标签:顺序,队列,length,base,3.8,front,rear,指针
From: https://www.cnblogs.com/wangjunxiang/p/17231794.html

相关文章

  • 3.9 队列的链式表示和实现
    3.5.3队列的链式表示和实现适用于用户无法估计所用队列的长度,则适宜采用该类型的队列链式队列的结构图如下所示链队列的类型定义//这里是定义是每个节点类型t......
  • 3.1 栈和队列定义和特点
    栈和队列是限定插入和删除的只能在表“端点”进行的线性表普通线性表的插入和删除操作栈的定义和特点栈(stack)是一个特殊的线性表,是限定的仅在一端(通常是表尾)进行插......
  • 3.4 顺序栈的表示和实现
    由于栈本身就是线性表,于是栈也有顺序存储和链式存储两种实现方式栈的顺序存储——顺序栈栈的链式存储——链栈顺序栈的表示和实现存储方式:同一般线性表的顺序存......
  • 线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?
    线程池中阻塞队列的作用:1.⼀般的队列只能保证作为⼀个有限⻓度的缓冲区,如果超出了缓冲⻓度,就⽆法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续⼊队的任务。2.......
  • 【LeetCode贪心#08】根据身高重建队列(还是涉及处理两个维度的信息)
    根据身高重建队列力扣题目链接(opensnewwindow)假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i]=[hi,ki]表......
  • 2023-03-17 堆和优先队列
    01_编译的详细过程我们这里虽然介绍的是c程序的编译过程,但是实际上所有编译型语言的编译过程,大致是类似的编译的四个过程我们平时编译时,不管是通过IDE图形界面来编译......
  • 力扣---剑指 Offer 09. 用两个栈实现队列
    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHe......
  • 路飞:上线架构图、阿里云购买云服务器ECS、云服务器安装mysql、云服务器安装redis(源码
    目录一、上线架构图二、阿里云购买云服务器ECS2.1试用版云服务器ECS获取流程2.2ssh客户端连接远程服务器2.3finalshell连接远程数据库2.4远程服务器的准备工作三、云服务器......
  • .NET Threadpool 饥渴,以及队列是如何使它更糟的
    .NETThreadpool饥渴,以及队列是如何使它更糟的.NETThreadpoolstarvation,andhowqueuingmakesitworse-CriteoEngineering已经有一些对threadpool饥渴的讨论......
  • 线程执行顺序
    线程执行顺序在做面试题的时候,发现有关线程执行顺序的一个常见考题:(纯纯考研审题)packagelink;publicclassTest{publicstaticvoidmain(String[]args){......