首页 > 其他分享 >3.9 队列的链式表示和实现

3.9 队列的链式表示和实现

时间:2023-03-18 21:22:27浏览次数:38  
标签:QNode 队列 next 算法 链式 front rear 3.9

3.5.3 队列的链式表示和实现


适用于用户无法估计所用队列的长度,则适宜采用该类型的队列

  • 链式队列的结构图如下所示

  • 链队列的类型定义

    // 这里是定义是每个节点类型
    typedef struct Qnode{
      	QElemType data;
      	struct Qnode *next;
    }QNode,*QueuePtr;
    
    typedef struct{
      	QuenePtr front;	// 队头指针
      	QuenePtr rear;	// 队尾指针
    }LinkQueue;
    
  • 链队列运算指针变化

    • 空队列情况是:Q.front==Q.rear
    • 元素x入队列:Q.rear=x
    • y入队列:Q.rear=y;

链队列初始化

  • 【算法描述】

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

销毁队列

  • 【算法思想】从队头结点开始,依次释放所有结点

  • 【算法描述】

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

将元素e入队

  • 【算法思想】在队尾插入新元素

  • 【算法描述】

    Status EnQueue(LinkQueue &Q,ElemType e){
      	//QNode p=new QNode();
      	QNode p=(QueuePtr)malloc(sizeof(QNode));
      	p->data=e;
      	p->next=NULL;
      	Q.rear->next=p;
      	Q.rear=p;
      	return OK;
    }
    

链队列出队

  • 【算法思想】在队头进行删除元素

  • 【算法描述】

    Status DeQueue(LinkQueue &Q,ElemType &e){
      	// 首先是判断队列是否为空
      	if(Q.front==Q.rear)
          	return ERROR;
      	QNode p=Q.front->next;
      	Q.front=p->next;
      	free(p);
      	return OK;
    }
    

求链队列的队头元素

  • 【算法思想】查询队头元素的值

  • 【算法描述】

    Status GetHead(LinkQueue Q,QElemType &e){
      	if(Q.front==Q.rear)// 判断队列是否为空
          return ERROR;
      	e=Q.front->next->data;
    }
    

标签:QNode,队列,next,算法,链式,front,rear,3.9
From: https://www.cnblogs.com/wangjunxiang/p/17231797.html

相关文章

  • 3.1 栈和队列定义和特点
    栈和队列是限定插入和删除的只能在表“端点”进行的线性表普通线性表的插入和删除操作栈的定义和特点栈(stack)是一个特殊的线性表,是限定的仅在一端(通常是表尾)进行插......
  • 线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?
    线程池中阻塞队列的作用:1.⼀般的队列只能保证作为⼀个有限⻓度的缓冲区,如果超出了缓冲⻓度,就⽆法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续⼊队的任务。2.......
  • 【LeetCode贪心#08】根据身高重建队列(还是涉及处理两个维度的信息)
    根据身高重建队列力扣题目链接(opensnewwindow)假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i]=[hi,ki]表......
  • 2023-03-17 堆和优先队列
    01_编译的详细过程我们这里虽然介绍的是c程序的编译过程,但是实际上所有编译型语言的编译过程,大致是类似的编译的四个过程我们平时编译时,不管是通过IDE图形界面来编译......
  • 力扣---剑指 Offer 09. 用两个栈实现队列
    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHe......
  • .NET Threadpool 饥渴,以及队列是如何使它更糟的
    .NETThreadpool饥渴,以及队列是如何使它更糟的.NETThreadpoolstarvation,andhowqueuingmakesitworse-CriteoEngineering已经有一些对threadpool饥渴的讨论......
  • 使用队列实现QQ号
    procedureTForm1.Button1Click(Sender:TObject);varqueue:TQueue;i:integer;s:string;beginqueue.head:=1;queue.tail:=1;fori:=1to9dobe......
  • Linux进程通信 | 消息队列
    什么是消息队列?假设你是一个快递员,你需要将货物从一个仓库运到另一个仓库。但是你发现自己的时间不够用,需要另外请一个人来帮忙。那么,你们之间如何进行协作呢?一种方式是......
  • 为什么需要消息队列?使用消息队列有什么好处?
    为什么需要消息队列?当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。消息被发送到队列中,“消息队列”是在消......
  • 【LeetCode】232.使用栈模拟队列
    使用栈模拟队列​ 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队......