【循环顺序队的实现】

1.队列的逻辑结构 与 抽象数据类型定义

  • 先进先出的线性表
    在这里插入图片描述
    在顺序队列中,我们使用头指针front指向队首元素;用尾指针rear指向队尾元素的下一个位置(当然这里的指针是用下标模拟出来的
    同时顺序队列中的元素当然是用数组来存储的

  • 抽象数据类型如下
    在这里插入图片描述
    注意这里的传参,本篇使用指针传参,与图中c++的引用有所区别

2.一般顺序队列的模拟操作

  • 初始时,头尾指针均指向下标为0的位置
  • 始终遵循先进先出原则;队头出队,队尾入队
    在这里插入图片描述

3.一般顺序队所面临的假上溢问题:(问题一)

设数组大小为MAXQSIZE
当尾指针rear==MAXQSIZE时 就会出现溢出现象,而这种溢出又分为两种情况

  • 1.真溢出
    即数组的所有空间都存在元素

特征为:
(1)头指针 front = 0
(2)尾指针 rear = MAXQSIZE

在这里插入图片描述

  • 2.假溢出
    即数组中还存在空闲空间,但尾指针已经越界

特征为:
(1)头指针 front != 0
(2)尾指针 rear = MAXQSIZE

在这里插入图片描述
而为了避免这种假上溢问题,我们就引入了循环队列来解决

4.循环队列解决假上溢问题

4.1将队中元素依次向队头方向移动

但是这样做有一个显著的缺点,即浪费时间;每移动一次,队中元素都要移动。所以并不推荐

4.2循环队列解决假上溢问题

将队空间设想成一个循环的表,即分配给队列的m个存储单元可以循环使用,当rear为maxqsize时若数组的开始端空着,又可从头使用空着的空间;当front为maxqsize时,同理。

设数组名为data, 则核心思路为:

  • data[0]接在data[MAXQSIZE-1]之后
  • 即当rear+1==MAXQSIZE时,令rear=0;

要想实现上述顺序的循环操作,就需要一个重要的运算方法,即模运算
在这里插入图片描述

  • 队尾插入元素时:
Q->data[Q->rear]=e;//将元素插入到当前尾指针指向的空间(即队尾元素的后一个位置)
Q->rear=(Q->rear+1)% MAXQSIZE;//更新队尾指针指向队尾元素的下一个位置

这里取模的作用就是rear为maxqsize时若数组的开始端空着,就可以更新尾指针指向空着的开始端空间(详见第2种插入的情况)

    • 1.一般情况下的插入:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

      1. 数组存在空闲的开始端在数组的最后一个空间插入时(此时尾指针需要更新到空闲的数组开始端):

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 队头删除元素时:
*e=Q->data[Q->front];//将队头元素传递给变量e
Q->front=(Q->front+1)% MAXQSIZE;//更新队头指针指向当前队头的位置

这里取模的作用就是front为maxqsize时若数组的开始端空着,就可以更新头指针指向空着的开始端空间(详见第2种删除的情况)

    • 1.一般情况下的删除:
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述

    • 2.数组存在空闲的开始端且此时头指针指向的空间为数组的最后一个空间(此时头指针需要更新到空闲的数组开始端):
      在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

4.3循环顺序对的 物理结构 与 逻辑结构 的辨析

在解决假上溢问题时,我用一维数组的结构图来分析了具体的操作,而这正是循环顺序对的真实的物理结构,我们仅仅是使用特定的操作使其操作起来如同想象中的头尾相连的环形逻辑结构而已,如下图:

在这里插入图片描述

5.循环队列面临的队空 与 队满判断条件一致的问题 (问题二)

通过取模法我们解决了一般队列的假上溢问题,但是,正常的循环顺序对又给我们带来了新的问题,如下图:
在这里插入图片描述
通过分析我们可以发现,若每个空间都存储一个队列元素,那么不论是队满还是队空,两种情况的判断条件会完全一致

Q->front==Q->rear

6.解决队空 与 队满判断条件一致的方法:

一般有如下三种解决方案,而本篇使用第3种
在这里插入图片描述

6.1循环队列解决队满时判断方法–少用一个元素空间:

在这里插入图片描述
这种方式可以区别队空和队满的判断条件:
判断队空(头尾指针重合时,队空):

Q->front==Q->rear//头尾指针指针重合时,队空

判断队满(由于少用一个空间,故头尾指针相邻时,队满):

(Q->rear+1)%MAXQSIZE==Q->front
//见上图:共有两种情况
<1>一般情况,Q->rear+1==Q->front
<2>当尾指针指向数组最后一个空间(rear+1==MAXQSIZE)
头指针指向数组第一个空间时(rear==0),
需要用到取模运算:(Q->rear+1)%MAXQSIZE==Q->front

7.循环顺序队的整队实现(少用一个元素空间)

7.1队列的顺序存储结构

//1.队列的顺序存储结构
typedef struct Queue
{QElemType * data;//存储元素的动态数组int front;//头指针,若队列不空,指向队列头元素int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置//注意这里的头尾指针并不是指针变量,而是用下标模拟指针功能的int变量
}Queue;
//Queue:用来定义循环顺序对列

一个循环顺序队的存储结构中包含头指针,指向队列头元素尾指针,指向队列尾元素的下一个位置存储元素的动态数组这三个部分

7.2循环顺序队的初始化

注意:这里需要传入结构指针,因为要修改结构体中成员进行动态分配内存

bool InitQueue(Queue *q)
7.2.1算法步骤:

(1)为循环顺序对动态分配空间
(2)初始化头尾指针为0,表示队列为空

//1.循环顺序队的初始化
//注意:这里需要传入结构指针,因为要修改结构体中成员进行动态分配内存
bool InitQueue(Queue *q)
{//[1]为循环顺序对动态分配空间q->data=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));//这里由于数组首地址为一个指针,故可以使用q.data来接受mallocmalloc返回的指针if (!q->data){return false;//内存分配失败}//[2]初始化头尾指针为0,表示队列为空q->front=q->rear=0;return true;
}

7.3求循环顺序队的长度

注意:这里不用传入结构指针,因为只计算长度,不改变结构体

int QueueLength(Queue q)
7.3.1算法步骤:

(1)(尾指针 与 头指针作差 再加MAXQSIZE)并取余MAXQSIZE,得到队列长度
//注意这里加MAXQSIZE并取余MAXQSIZE,是防止尾指针在低地址端

7.3.2三种情况下的图解

在这里插入图片描述

//2.求循环顺序队的长度
//注意:这里不用传入结构指针,因为只计算长度,不改变结构体
int QueueLength(Queue q)
{//[1](尾指针 与 头指针作差 再加MAXQSIZE)并取余MAXQSIZE,得到队列长度//注意这里加MAXQSIZE并取余MAXQSIZE,是防止尾指针在低地址端return (q.rear - q.front + MAXQSIZE) % MAXQSIZE;
}

7.4循环顺序队的入队操作(核心1)

注意:这里需要传入结构指针,因为要修改结构体中成员:传入元素,修改尾指针

bool EnQueue(Queue * q,QElemType e)
7.4.1算法步骤:

1)判断队列是否已满
(2)进行入队操作
<1>新元素插入到当前尾指针指向的空间(当前队尾元素的下一个位置)
<2>更新尾指针,指向新的队尾结点的下一个位置

//3.循环顺序队的入队操作
//注意:这里需要传入结构指针,因为要修改结构体中成员:传入元素,修改尾指针
bool EnQueue(Queue * q,QElemType e)
{//[1]判断队列是否已满//这里对MAXQSIZE进行取余,是为了应对以下情况//尾指针指向数组最后一个空间(rear+1==MAXQSIZE),头指针指向数组第一个空间时(rear==0)//因为 MAXQSIZE % MAXQSIZE == 0if ((q->rear + 1) % MAXQSIZE == q->front){return false;//队满}//[2]进行入队操作//<1>新元素插入到当前尾指针指向的空间(当前队尾元素的下一个位置)q->data[q->rear] = e;//<2>更新尾指针,指向新的队尾结点的下一个位置//这里对MAXQSIZE进行取余,是为了应对以下情况(防止上溢出)//尾指针指向数组最后一个空间(rear+1==MAXQSIZE),要更新尾指针指向数组第一个空间时(rear==0)   //因为 MAXQSIZE % MAXQSIZE == 0q->rear = (q->rear + 1) % MAXQSIZE;return true;
}

7.5循环顺序队的入队操作(核心2)

注意:这里需要传入结构指针,因为要修改结构体中成员:修改头指针

bool Dequeue(Queue * q,QElemType * e)
7.5.1算法步骤:

(1)判断队列是否为空
(2)保存队头元素
(3)更新头指针,指向新的队头结点

//4.循环顺序队的出队操作
//注意:这里需要传入结构指针,因为要修改结构体中成员:修改头指针
bool Dequeue(Queue * q,QElemType * e)
{//[1]判断队列是否为空if (q->rear == q->front){return false;//队空}//[2]保存队头元素*e = q->data[q->front];//[3]更新头指针,指向新的队头结点//这里对MAXQSIZE进行取余,是为了应对以下情况(防止上溢出)//头指针指向数组最后一个空间(front+1==MAXQSIZE),要更新头指针指向数组第一个空间时(front == 0) //因为 MAXQSIZE % MAXQSIZE == 0q->front = (q->front + 1) % MAXQSIZE;return true;
}

7.6循环顺序队的取队头元素操作(核心3)

注意:这里不需要传入结构指针,因为不修改结构体中成员,仅传出元素

bool GetFront(Queue q, QElemType* e)
7.6.1算法步骤:

(1)判断是否队空
(2)取出队头元素

//5.循环顺序队的取队头元素操作
//注意:这里不需要传入结构指针,因为不修改结构体中成员,仅传出元素
bool GetFront(Queue q, QElemType* e)
{//[1]判断是否队空if (q.rear == q.front){return false;//队空}//[2]取出队头元素*e = q.data[q.front];return true;
}

7.7循环顺序队的清空操作

注意:这里需要传入结构指针,因为要修改结构体中成员;头尾指针

bool ClearQueue(Queue* q) 
7.7.1算法步骤

(1)直接将头尾指针重置为0

//6.循环顺序队的清空操作
//注意:这里需要传入结构指针,因为要修改结构体中成员;头尾指针
bool ClearQueue(Queue* q) 
{//[1]直接将头尾指针重置为0//注意:这里是逻辑上的清空,物理上并没有清空队列,只是重置了头尾指针//在入队新元素时,是可以将原来队列中可能存在的元素覆盖掉的q->front = q->rear = 0; // 重置头尾指针return true;
}

7.8循环顺序队的销毁操作

注意:这里需要传入结构指针,因为要修改结构体中成员;头尾指针,并释放数组空间

bool DestroyQueue(Queue* q) 
7.8.1算法步骤

(1)直接销毁存储队列元素的动态数组
(2)注意重置头尾指针

//7.循环顺序队的销毁操作
//注意:这里需要传入结构指针,因为要修改结构体中成员;头尾指针,并释放数组空间
bool DestroyQueue(Queue* q) 
{//[1]直接销毁存储队列元素的动态数组if (q->data) {free(q->data); // 释放动态分配的内存q->data = NULL;}//[1]注意重置头尾指针q->front = q->rear = 0; // 重置指针return true;
}

7.9遍历队列并打印(从队头开始)

bool TraverseQueue(Queue* q)
7.9.1算法步骤:

(1)初始化计数器等于头指针的值
(2)循环遍历队列元素
注意更新计数器时的取模操作(i+1==MAXQSIZE时,i更新到下标为0处),保证循环结构的正确性

//8.遍历队列并打印(从队头开始)
bool TraverseQueue(Queue* q)
{//[1]初始化计数器等于头指针的值int i = q->front;//[2]循环遍历队列元素while (i != q->rear) {printf("%d ", q->data[i]);i = (i + 1) % MAXQSIZE;//注意更新计数器时的取模操作,保证循环结构的正确性}printf("\n");return true;
}

7. 10所有操作汇总:

//循环顺序队列(动态数组,用浪费一个数组空间的方式来解决)
#include<stdio.h>
#include<stdlib.h>#define MAXQSIZE 100//最大队列长度#define bool int
#define true 1
#define false 0typedef int QElemType;//1.队列的顺序存储结构
typedef struct Queue
{QElemType * data;//存储元素的动态数组int front;//头指针,若队列不空,指向队列头元素int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置//注意这里的头尾指针并不是指针变量,而是用下标模拟指针功能的int变量
}Queue;
//Queue:用来定义循环顺序对列//1.循环顺序队的初始化
//注意:这里需要传入结构指针,因为要修改结构体中成员进行动态分配内存
bool InitQueue(Queue *q)
{//[1]为循环顺序对动态分配空间q->data=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));//这里由于数组首地址为一个指针,故可以使用q.data来接受mallocmalloc返回的指针if (!q->data){return false;//内存分配失败}//[2]初始化头尾指针为0,表示队列为空q->front=q->rear=0;return true;
}//2.求循环顺序队的长度
//注意:这里不用传入结构指针,因为只计算长度,不改变结构体
int QueueLength(Queue q)
{//[1](尾指针 与 头指针作差 再加MAXQSIZE)并取余MAXQSIZE,得到队列长度//注意这里加MAXQSIZE并取余MAXQSIZE,是防止尾指针在低地址端return (q.rear - q.front + MAXQSIZE) % MAXQSIZE;
}//3.循环顺序队的入队操作
//注意:这里需要传入结构指针,因为要修改结构体中成员:传入元素,修改尾指针
bool EnQueue(Queue * q,QElemType e)
{//[1]判断队列是否已满//这里对MAXQSIZE进行取余,是为了应对以下情况//尾指针指向数组最后一个空间(rear+1==MAXQSIZE),头指针指向数组第一个空间时(rear==0)//因为 MAXQSIZE % MAXQSIZE == 0if ((q->rear + 1) % MAXQSIZE == q->front){return false;//队满}//[2]进行入队操作//<1>新元素插入到当前尾指针指向的空间(当前队尾元素的下一个位置)q->data[q->rear] = e;//<2>更新尾指针,指向新的队尾结点的下一个位置//这里对MAXQSIZE进行取余,是为了应对以下情况(防止上溢出)//尾指针指向数组最后一个空间(rear+1==MAXQSIZE),要更新尾指针指向数组第一个空间时(rear==0)   //因为 MAXQSIZE % MAXQSIZE == 0q->rear = (q->rear + 1) % MAXQSIZE;return true;
}//4.循环顺序队的出队操作
//注意:这里需要传入结构指针,因为要修改结构体中成员:修改头指针
bool Dequeue(Queue * q,QElemType * e)
{//[1]判断队列是否为空if (q->rear == q->front){return false;//队空}//[2]保存队头元素*e = q->data[q->front];//[3]更新头指针,指向新的队头结点//这里对MAXQSIZE进行取余,是为了应对以下情况(防止上溢出)//头指针指向数组最后一个空间(front+1==MAXQSIZE),要更新头指针指向数组第一个空间时(front == 0) //因为 MAXQSIZE % MAXQSIZE == 0q->front = (q->front + 1) % MAXQSIZE;return true;
}//5.循环顺序队的取队头元素操作
//注意:这里不需要传入结构指针,因为不修改结构体中成员,仅传出元素
bool GetFront(Queue q, QElemType* e)
{//[1]判断是否队空if (q.rear == q.front){return false;//队空}//[2]取出队头元素*e = q.data[q.front];return true;
}//6.循环顺序队的清空操作
//注意:这里需要传入结构指针,因为要修改结构体中成员;头尾指针
bool ClearQueue(Queue* q) 
{//[1]直接将头尾指针重置为0//注意:这里是逻辑上的清空,物理上并没有清空队列,只是重置了头尾指针//在入队新元素时,是可以将原来队列中可能存在的元素覆盖掉的q->front = q->rear = 0; // 重置头尾指针return true;
}//7.循环顺序队的销毁操作
//注意:这里需要传入结构指针,因为要修改结构体中成员;头尾指针,并释放数组空间
bool DestroyQueue(Queue* q) 
{//[1]直接销毁存储队列元素的动态数组if (q->data) {free(q->data); // 释放动态分配的内存q->data = NULL;}//[1]注意重置头尾指针q->front = q->rear = 0; // 重置指针return true;
}//8.遍历队列并打印(从队头开始)
bool TraverseQueue(Queue* q)
{//[1]初始化计数器等于头指针的值int i = q->front;//[2]循环遍历队列元素while (i != q->rear) {printf("%d ", q->data[i]);i = (i + 1) % MAXQSIZE;//注意更新计数器时的取模操作,保证循环结构的正确性}printf("\n");return true;
}// 主函数测试代码
int main() 
{Queue q;// 初始化队列if (InitQueue(&q)) {printf("初始化队列成功!\n");}// 入队操作for (int i = 1; i <= 10; i++) {EnQueue(&q, i);}// 遍历队列printf("队列中的元素: ");TraverseQueue(&q);// 出队操作int e;Dequeue(&q, &e);printf("出队元素: %d\n", e);// 再次遍历队列printf("队列中的元素: ");TraverseQueue(&q);// 取队头元素GetFront(q, &e);printf("队头元素: %d\n", e);// 清空队列ClearQueue(&q);printf("队列清空后长度: %d\n", QueueLength(q));// 销毁队列DestroyQueue(&q);return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/411777.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决STM32使用J-Link可以擦除和读取但是无法烧录问题

现象 使用J-Link烧录模组固件&#xff0c;出现可以读取和擦除&#xff0c;但是无法烧录问题&#xff0c;提示错误如下&#xff1a; ERROR: Programming failed address 0x08000080 (program error)End of flash programmingERROR: Program failed 读出来的时候这个地址数据…

Linux 软件包管理器yum 自动化构建工具-make/makefile

Linux 工具 linux 软件包管理器 yum 把一些常用的软件提前编译好&#xff0c;做成软件包放在一个服务器上&#xff0c;通过包管理器可以很方便的获取到在这个编译好的软件包。直接进行安装。 软件包和软件包管理器就相当于 App 和应用商店这样的关系。 Linux 安装软件 源代码…

poe供电原理以及应用

1,根据IEEE802.3af标准,一个完整的PoE系统包括供电端设备PSE和受电端设备PD两部分; 供电设备PSE是整个系统的电源提供者,为PD设备提供直流电源,其可分为M

如何理解进程

一、进程的概念 进程&#xff1a;顾名思义&#xff0c;就是一个完整执行程序的过程。没错&#xff0c;就是这么简单&#xff0c;但是在程序执行的过程之中&#xff0c;系统会为这个执行的程序分配内存资源&#xff0c;这些过程也包含在进程当中。 进程是动态的&#xff0c;是程…

【网络编程通关之路】 Tcp 基础回显服务器(Java实现)及保姆式知识原理详解 ! ! !

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

Linux下IO多路复用—select,poll,epoll

一.概述 1.IO多路复用介绍 IO多路复用是一种操作系统的技术&#xff0c;用于在单个线程或进程中管理多个输入输出操作。它的主要目的是通过将多个IO操作合并到一个系统调用中来提高系统的性能和资源利用率&#xff0c;避免了传统的多线程或多进程模型中因为阻塞IO而导致的资源…

在Linux下搭建go环境

下载go go官网&#xff1a;All releases - The Go Programming Language 我们可以吧压缩包下载到Windows上再传到Linux上&#xff0c;也可以直接web下载&#xff1a; wget https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz 解压 使用命令解压&#xff1a; tar -x…

解决有向图中节点出度和入度计算问题

解决有向图中节点出度和入度计算问题 引言邻接链表表示法邻接链表的数据结构创建图添加边计算节点的出度伪代码C代码计算节点的入度伪代码C代码时间复杂度示例结论引言 在图论中,有向图是一种重要的数据结构,用于表示元素之间的方向性关系。有向图中的节点(顶点)通过边连接…

VBA之正则表达式(47)-- 快速将公式转换为静态值计算

实例需求&#xff1a;工作表I列包含多种计算公式&#xff0c;为了便于演示&#xff0c;将I列公式显示在J列单元格中&#xff0c;现在需要将公式的单元格引用转换为静态值&#xff0c;如K列所示。 示例代码如下。 Sub RegExpDemoReplace()Dim Res()Dim objRegEx As ObjectDim o…

[解决]Invalid configuration `aarch64-openwrt-linux‘: machine `aarch64-openwrt

背景 交叉编译libev-4.19 问题 checking host system type… Invalid configuration aarch64-openwrt-linux: machine aarch64-openwrt’ not recognized 解决 打开config.sub&#xff0c;在244行后添加"| aarch64-openwrt \ "

Git学习(001 git介绍以及安装)

尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab 总时长 5:42:00 共40P 此文章包含第1p-第p4的内容 文章目录 介绍Git介绍GitLab介绍 概述Git安装版本控制工具介绍 介绍 Git介绍 GitLab介绍 相当于中央仓库 概述 Git安装 进入官网(下载当前版本 2.43.0) …

解决 RT-Thread bsp stm32l476-st-nucleo STM32L4 HAL库缺失问题

问题描述 当前最新的 RT-Thread 版本&#xff1a;5.2.0&#xff0c;发现在 编译 BSP stm32l476-st-nucleo&#xff0c;缺少了 STM32L4xx_HAL 驱动库&#xff0c;造成生成的 工程&#xff0c;如 Keil MDK5 工程无法编译通过 初步的【临时】解决方法是 回退 RT-Thread 的版本&am…

rabbitmq发送的消息接收不到

1.消息被其他消费者消费 2.主要说的2这种情况&#xff0c;就是在延迟队列中&#xff0c;忘记给一个bean加注解导致日志报exchange not found. 这个报错&#xff0c;进而引发了bindings没有绑定。没有绑定的话&#xff0c;发送消息就会接收不到。

心脑血管科曹启富医生谈:引起高血压的原因

曹医生指出&#xff0c;高血压这一日益普遍的健康问题&#xff0c;其根源深藏于多重复杂因素之中。首要提及的便是年龄因素&#xff0c;它如同时间的刻度&#xff0c;悄然影响着我们的血管健康。随着年龄的增长&#xff0c;血管逐渐失去往昔的弹性与活力&#xff0c;变得僵硬而…

HTMl标签;知识回忆;笔记分享;

HTML标签是用于定义和组织网页内容的基础构建块。每个标签都有特定的作用。 一&#xff0c;标准结构标签&#xff1a; HTML文档标准结构&#xff1a; <html><head></head><body>this is my second html... </body> </html> 【1】htm…

python-FastApi框架

文章目录 FastApi一. 简介二. 特性三. 安装1. 安装fastapi模块2. 安装ASGI服务器( Uvicorn 或者 Hypercorn) 四. 实例1. 创建**main.py**文件(GET请求)2. 运行3. 测试4. 更新main_py(加入PUT请求) 五. 自动化API文档1. Swagger UI(交互式文档)2. ReDoc(可选式文档) FastApi 一…

企微获客链接 中文乱码问题处理

企微获客链接 中文乱码问题处理 问题背景问题处理补充内容 问题背景 为了推广产品&#xff0c;同时更好的服务客户&#xff0c;公司在接入企业微信后&#xff0c;需要用到企微获客链接相关推广操作&#xff0c;那么通过API 接口创建企微获客链接时&#xff0c;出现了中文乱码问…

OpenCV 图像处理基础算法介绍c++

VS2022配置OpenCV环境 关于OpenCV在VS2022上配置的教程可以参考&#xff1a;VS2022 配置OpenCV开发环境详细教程 图像处理 图像处理是一个广泛的领域&#xff0c;它涉及到对图像数据进行分析、修改和改进的各种技术。以下是一些基本的图像处理操作&#xff0c;这些操作通常可…

AntV G6 的坑之——渲染残留/残影

G6 4.x 依赖的渲染引擎 antv/g4.x 版本支持了局部渲染&#xff0c;带了性能提升的同时&#xff0c;也带来了图形更新时可能存在渲染残影的问题。比如拖拽节点时&#xff0c;节点的文本会留下轨迹。 解决办法&#xff1a; 关闭局部渲染&#xff0c;graph.get("canvas"…

uni-app组件

一. 什么是组件,有什么好处? 在uni-app中&#xff0c;组件是构成应用的基本单位&#xff0c;它们是用来定义用户界面的一部分&#xff0c;并且通常包含了视图和逻辑。组件的设计使得开发者能够以声明式的方式构建应用界面&#xff0c;并且通过组件化的开发方式来提高代码的复…