队列

【数据结构】队列(顺序队列、循环队列、链队列) 文章目录 前言 一、队列的定义 二、队列的顺序存储结构 1.顺序队列的定义 2.循环队列定义 3.循环队列的基本操作 三、队列的链式存储结构 1.链队列的定义 2.链队列的基本操作 前言 队列也是一种线性表,其特殊性在于队列的基本操作是线性表的子集。队列按“先进先出”的规则进行操作,故称其为操作受限的线性表。 一、队列的定义 队列(queue)是只允许在一端进行插入操作,在另一端进行删除操作的线性表,简称“队”。 队列是一种先进先出(First In First Out)的 阅读详情

1 基本概念

队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素。

2 抽象数据类型(ADT)

数据对象:{a1,a2,.....,an},每个元素类型为DataType,与线性表类似。

数据关系:除第一个元素外,每一个元素有且只有一个直接前驱元素;除最后一个元素外,每个元素有且只有一个直接后驱。一对一  的对应关系。在队列中,允许插入的一端叫做队尾,允许删除的一端则称为队头。

基本操作:

                 InitQueue(*Q): 初始化队列。

                 DestroyQueue(*Q): 若队列存在,则销毁它。

                 ClearQueue(*Q): 清空队列。

                 QueueEmpty(*Q): 若队列为空,返回True,否则返回False。

                 GetHead(Q,*e): 若队列存在且非空,则返回队列Q的队头元素。

                 EnQueue(*Q,e): 若队列存在,插入元素e。

                 DeQueue(*Q,*e): 删除队头元素,并返回值给e。

                 QueueLength(Q): 返回队列元素个数

3 链队列

用链表表示的队列,需要头指针和尾指针。

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h> 
//链队列存储结构定义  
typedef int ElemType;         //元素的数据类型根据实际情况而定,这里假设为int 
typedef struct Node 
{
	ElemType data;            //数据域,用于存储结点数据 
	struct Node *next;        //指针域,存储下一个结点的地址信息              
}QNode,*Queueptr;

typedef struct
{
	Queueptr front,rear;     //定义头指针和尾指针 
}LinkQueue;

int InitQueue(LinkQueue*Q)    //建立队列 
{
	Q->front=(QNode*)malloc(sizeof(QNode));   //建立头结点 
	if (!Q->front) return ERROR;
	Q->front->next=NULL;   
	Q->rear=Q->front;           //头尾指针同时指向头结点,队列为空 
	return OK;
}

int DestroyQueue(LinkQueue*Q)  //摧毁队列 
{
	if (!Q->front) return ERROR;
	while(Q->front)       //从头结点开始依次释放结点空间 
	{
		Q->rear=Q->front->next;
		free(Q->front);
		Q->front=Q->rear;
	} 
	return OK;
}

int ClearQueue(LinkQueue*Q) //清空队列 
{
	Q->front->next=NULL;          //使头结点指向空 
	Q->front=Q->rear;             //使头指针和尾指针同时指向头结点 
	return OK;
}

int QueueEmpty(LinkQueue*Q)  //验证队列是否为空 
{
	if (Q->front==Q->rear) return TRUE;
	return FALSE; 
}

int GetHead(LinkQueue Q,ElemType*e)   //得到队头元素 
{
	if (Q.front==Q.rear) return ERROR;
	*e=Q.front->next->data;
	return OK; 
}

int EnQueue(LinkQueue*Q,ElemType e)  //插入元素e队列 
{
	QNode*p;
	if (!Q->front) return ERROR;
	p=(QNode*)malloc(sizeof(QNode));
	p->data=e;
	p->next=NULL;                  //使新节点next指针指向空 
	Q->rear->next=p;               //使前一结点指向新节点 
	Q->rear=p;                     //使尾指针指向新节点 
}

int DeQueue(LinkQueue*Q,ElemType*e)  //删除队头元素,返回值给e 
{
	QNode*p;
	if (!Q->front) return ERROR;
	p=Q->front->next;                //记录队头结点 
	*e=p->data;
	Q->front->next=p->next;          //将头结点指向队头结点的下一个结点 
	if (Q->rear==p) Q->rear=Q->front;  //若队头结点为最后一个结点,则使尾指针指向头结点 
	free(p);                          //释放队头结点 
	return OK;
}

int QueueLength(LinkQueue Q)   //返回队列长度 
{
	QNode*p;
	int num=0;
	if (!Q.front) return ERROR;
	p=Q.front->next;
	while(p)              //遍历 
	{
		p=p->next;
		num++;
	}
	return num;
	
}

int main()  
{  
    LinkQueue Q;  
    QNode*p;  
    int e,choice;   
    do{  
        e=0;  
        printf("输入操作: 0.退出 1.返回队列长度 2.插入 3.删除 4.获取队列头元素值 5.清空队列 6.创建队列 7.销毁队列 8.验证队列是否为空\n");  
        scanf("%d",&choice);  
        switch (choice)  
        {  
            case 1:  
            {  
                e=QueueLength(Q);  
                printf("%d\n",e);  
                break;  
            }  
            case 2:  
            {  
                printf("输入插入元素值\n");  
                scanf("%d",&e);    
                EnQueue(&Q,e);  
                break;  
            }  
            case 3:  
            {     
                DeQueue(&Q,&e);  
                printf("%d\n",e);  
                break;  
            }  
            case 4:  
            {    
                GetHead(Q,&e);  
                printf("%d\n",e);  
                break;  
            }  
            case 5:  
            {  
                ClearQueue(&Q);  
                break;  
            }  
            case 6:  
            {  
                InitQueue(&Q);  
                break;  
            }  
            case 7:  
            {  
                DestroyQueue(&Q);  
                break;  
            } 
			case 8:
			{
				printf("%d\n",QueueEmpty(&Q));
				break;
			} 
        }  
        printf("[");  
        p=Q.front->next;  
        while (p)              
        {  
            printf("%d ",p->data);  
            p=p->next;  
        }  
        printf("]\n");  
    }while(choice!=0);   
    return 0;  
}  

4 循环队列

头尾相接的顺序存储队列结构,需要头指针和尾指针。

#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#include <stdlib.h>
#include <stdio.h> 
//队列的顺序存储结构定义
#define MAXSIZE 10  
typedef int ElemType;         //元素的数据类型根据实际情况而定,这里假设为int 
typedef struct
{
	ElemType * base;    //基地址     
	int front;         //头指针,指向第一个元素 
	int rear;          //尾指针,指向最后一个元素的下一个位置 ,当头指针和尾指针指向相同时,队列为空 
}Queue; 

int InitQueue(Queue*Q)    //建立队列 
{
	Q->base=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));   //申请存储空间 
	if (!Q->base) return ERROR;
	Q->front=0;          //头尾指针初始化 
	Q->rear=0; 
	return OK;
}

int DestroyQueue(Queue*Q)  //摧毁队列 
{
	if (!Q->base) return ERROR;
	free(Q->base);
	Q->front=0;
	Q->rear=0;
	return OK;
}

int ClearQueue(Queue*Q) //清空队列 
{
	if (!Q->base) return ERROR;
	Q->front=0;
	Q->rear=0;
	return OK; 
}

int QueueEmpty(Queue*Q)  //验证队列是否为空 
{	
	if (!Q->base) return ERROR;
	if (Q->front==Q->rear) return TRUE;   
	return FALSE;
}

int GetHead(Queue Q,ElemType*e)   //得到队头元素 
{
	if (!Q.base) return ERROR;
	*e=*(Q.base+Q.front);
	return OK;
}

int EnQueue(Queue*Q,ElemType e)  //插入元素e队列 
{
	if ((Q->rear+1)%MAXSIZE==Q->front) return ERROR;     //若队列已满,返回错误 
	*(Q->base+Q->rear)=e;
	Q->rear=(Q->rear+1)%MAXSIZE;                        //尾指针下移一个单位,若到达存储空间最后,则回到开头。         
	return OK;
}

int DeQueue(Queue*Q,ElemType*e)  //删除队头元素,返回值给e 
{
	if (Q->front==Q->rear) return ERROR;
	*e=*(Q->base+Q->front);
	Q->front=(Q->front+1)%MAXSIZE;                   //头指针下移一个单位,若到达存储空间最后,则回到开头。
	return OK;
}

int QueueLength(Queue Q)   //返回队列长度 
{
	if (Q.rear>=Q.front) return Q.rear-Q.front;      //若尾指针在头指针后 
	else return MAXSIZE-(Q.front-Q.rear);            //若尾指针在头指针前 
}

int main()  
{  
    Queue Q;
	ElemType*p;    
    int e,choice;   
    do{  
        e=0;  
        printf("输入操作: 0.退出 1.返回队列长度 2.插入 3.删除 4.获取队列头元素值 5.清空队列 6.创建队列 7.销毁队列 8.验证队列是否为空\n");  
        scanf("%d",&choice);  
        switch (choice)  
        {  
            case 1:  
            {  
                e=QueueLength(Q);  
                printf("%d\n",e);  
                break;  
            }  
            case 2:  
            {  
                printf("输入插入元素值\n");  
                scanf("%d",&e);    
                EnQueue(&Q,e);  
                break;  
            }  
            case 3:  
            {     
                DeQueue(&Q,&e);  
                printf("%d\n",e);  
                break;  
            }  
            case 4:  
            {    
                GetHead(Q,&e);  
                printf("%d\n",e);  
                break;  
            }  
            case 5:  
            {  
                ClearQueue(&Q);  
                break;  
            }  
            case 6:  
            {  
                InitQueue(&Q);  
                break;  
            }  
            case 7:  
            {  
                DestroyQueue(&Q);  
                break;  
            } 
			case 8:
			{
				printf("%d\n",QueueEmpty(&Q));
				break;
			} 
        }  
        printf("[");  
        p=Q.base+Q.front;  
        while (p!=(Q.base+Q.rear))             
        {  
            printf("%d ",*p);  
            p++;
			if (p==Q.base+MAXSIZE) p=Q.base;  
        }  
        printf("]\n");  
    }while(choice!=0);   
    return 0;  
} 

5 总结

循环队列和链队列的大部分基本操作(返回长度的时间复杂度为O(n))时间复杂度都为O(1)。循环队列长度固定,而链队列的长度则可以扩展,因此链队列更为灵活。在队列长度可以确定的情况下,循环队列较好,在队列长度不确定时,链队列比较好。



c语言建立队列(顺序队列、循化队列和链式队列) c语言建立队列 一、顺序队列 队列的顺序存储结构 顺序队列的讨论 "下溢"现象 "真上溢"现象 "假上溢"现象 二、如何解决"假上溢"问题 三、循环队列 循环队列说明 循环队列的实现方法 1、设置一个标记以区别队列是空还是满 2、使用一个计数器记录队列中元素的总数 3、保留对空条件,修改队满条件(常用) 循化队列的存储结构定义 初始化队列 设置标志 入队操作 出队操作 设置计数器方法 入队操作 出队操作 方法三 入队操作 出队操作 其余操作 四、链式队列 说明 链式存储结构 入队操作 出队操作 其余操作 阅读详情

相关推荐

队列,顺序队列,循环队列,链式队列

为了解决“假溢出”现象,使得队列的存储空间得到充分利用,一个巧妙的方法就是将顺序队列的数组看成一个头尾相接的循环结构。队列的头尾相接的顺序存储结构称为循环队列。题:当循环对列为空或满时,都是队尾指针等于队头指针,即rear==front。当rear==front时,该是判满还是判空呢?解决方案:方案一:设置一个计数器,开始时计数器设为0,新元素入队时,计数器加1,元素出队,计数器减1。当计数器==MAXSIZE时,队满;计数器==0时,队空。

qq_43389859的博客 1281

链队列的基本操作(初始化、销毁、清空等)

(1)实验目的 通过该实验,使学生理解链队列的构造特点并灵活应用,掌握链队基本操作的编程实现,认识栈是在一端进行插入,在另一端进行删除集中操作的线性结构,掌握队列的“先入先出”操作特点,知道判断队列空和满的条件,进一步熟悉C语言中指针操作。 (2)实验内容 用链式存储结构,实现教材定义的队列的基本操作。 (3)参考界面 菜单中包括以下功能: 1.初始化队列,2.销毁队列,3.清空队列,4. 队列判空,5.求队列长度,6.获取队头元素,7.插入一个 元素...

m0_56287454的博客 1万+

顺序队列/链式队列

        队列是另一种限定性的线性表,他只允许在表的一端插入元素,而在表的另一端删除元素,具有“先进先出”的特点。在队列中,允许插入的一端称为队尾,允许删除的一端称为队首。        与线性表相似,队列也有两种存储结构:顺序队列和链式队列。一,顺序队列        顺序队列使用顺序表来实现的,即队列中的元素均存放在一片连续的内存空间中。通过该片内存的地址对队列中元素进行访问。之前是用数...

sandmm112的博客 2760

清空链队列 c语言,【C语言实现】链队列(内有完整代码)

简书内代码已上传GitHub:点击我 去GitHub查看代码如有错误,还请大佬们一定留言指出!!建议先阅读 顺序队列 后再食用单链队列不在身边的你,也链接着我一. 链队列相信只要是开始了解链队列的小伙伴已经对线性表了如指掌了,上一篇 写到了顺序存储方式的队列需要用循环队列来实现,但实现难度和扩展性都比链队列差了多...我...自己认为...单链队列真的...没必要有头节点,直接第一个节点就储存元素...

weixin_42298969的博客 1949

C++队列、双向队列、单调队列

队列(Queue)是一种基本的线性数据结构,它遵循先进先出(First In First Out, FIFO)的原则。这意味着最先被添加到队列中的元素将会是最先被移除的。和生活中,无人插队的队列一样。队列内部实现可能是连续空间,也可能是多段空间。

闻缺陷则喜何志丹 3604

vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法

背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。

qq_43573047的博客 2946

数据结构-队列-链式存储完整可执行代码

数据结构-队列-链式存储完整可执行代码 #include #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存储空间初始分配量 */ typedef int Status; /* QElemType类型根据

Colin丶 2417

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3789

链队列(LinkQueue.h和LinkQueue.c) 分享

/*链队列存储结构(LinkQueue.h)*/ typedef struct QNode { QElemType data; struct QNode *next; }QNode, *QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; /*****************...

hcleon66的博客 814

OSGEarth 基于鼠标位置缩放

说明 osgearth 原有漫游器EarthManipulator 不支持此功能,所以需要修改此漫游器代码,其中主要原理就是在缩放的同时也要改变当前漫游器中心焦点的位置,从而保持鼠标指定点的位置缩放是不改变。 核心代码修改部分 EarthManipulator 的头文件zoom方法添加参数view /** * Zoom the camera using delt...

Rsoftwaretest的专栏 3782

ZEMAX学习 6.一个照相物镜的设计

曲线越平滑表示场曲越小,曲线越接近水平,系统边缘与中心对比度越接近,虚实越接近表示色差和色散越好;第1个面设计不合理,出现前后表面相交的情况,点击第1面厚度,选择边缘厚度,设置为0.1,第1面厚度被控制在0.1mm厚,系统根据这一设置始终保持第1面边缘厚度为0.1mm。要求:设计一个照相物镜,焦距f=9mm,F#为4,视场角40°;添加有效焦距操作数EFFL 9mm 权重为1,设置优化变量,如下图,ctrl+shift+o打开优化界面。报告中系统数据有效焦距为67.381mm,设计要求为9mm;

qq_24542783的博客 4711

python数据结构之队列

  队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。   队列是一种先进先出的(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最...

dingguan3434的博客 190

Allegro如何导出和导入器件模型Signal_Model操作指导

在用Allegro做PCB设计的时候,通常需要给器件加上Signal_Model,在做等长的时候用到的非常频繁。如下图,需要把R7002的Signal_Model导入到另外一块没有给R7002加好模型的BRD中。Allegro除了可以给器件添加模型,还支持从一块加好模型的BRD导入到另外一块BRD中,如何导出和导入器件模型Signal_Model操作指导。

weixin_54787054的博客 1896

队列(顺序队列,循环队列,链式队列)超详细讲解

本文是队列(包括顺序队列,循环队列,栈式队列的详细讲解)

m0_56992713的博客 5721

基于卷积神经网络CNN实现电力负荷多变量时序预测(PyTorch版)

随着智能电网的发展,精准的电力负荷预测对能源调度和电网稳定具有重要意义。本文基于PyTorch框架,提出一种基于卷积神经网络(CNN)的多变量时间序列预测模型,用于电力负荷的短期预测。

时序笔记 988

功能安全Safety Case构建方法论

本文系统阐述了功能安全认证中SafetyCase的构建方法。SafetyCase是一套结构化论证体系,通过Claim-Argument-Evidence(CAE)逻辑链证明系统安全性,包含系统级、技术安全级和实现级三层论证。文章详细介绍了SafetyCase的核心框架、与FMEDA等验证方法的关系、工程化实施步骤,以及常见失效模式。特别强调SafetyCase连接理论、实现与证据的桥梁作用,是功能安全认证的灵魂文件,要求将分散的安全活动组织成完整的逻辑论证。

VehSwHwDeveloper的博客 577

队列文档之双端队列

双端队列是普通队列的扩展,是指允许两端都可以进行入队和出队操作的队列(即可以在队头进行入队和出队操作,也可以在队尾进行入队和出队操作的队列)。

二木成林 1万+

【思博伦】史上最详细Spirent TestCenter测试仪使用教程精讲(一)!图解超赞超详细!!!

3. 在弹出的界面中,找到菜单栏中的“Connect/Create”,选择下拉框中的“Connect to Physical/Visual Chassis”,在弹出的对话框中输入思博伦测试仪的IP地址:192.168.6.244,点击“OK”;说明:目前我们只需要使用到Raw Stream Block,不需要用到Bound Stream Block。说明:如果要使用100G模式,由于硬件限制,必须连续3个面板端口同时配置为100G使用。打开安装包,并按照提示按照即可。

风云说通信 6479

队列——顺序队列和链式队列

队列是一种遵循先进先出(FIFO)原则的线性表,仅允许在队尾插入、队头删除。其核心体现在缓冲协调(平衡速度差异)、延时任务管理(如订单超时处理)、多线程协作(阻塞队列)及LRU缓存淘汰等场景。顺序队列用数组实现,存在“假溢出”问题,通过循环队列解决,牺牲一个存储单元以(rear+1)%MAX_SIZE==front判断队满,front==rear判队空。链式队列基于链表,动态分配内存,无溢出风险,入队时尾插新节点,出队删除队头节点并释放内存,通过front和rear指针维护队列状态,适用于长度不确定的场景。

2503_92090935的博客 2221

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

阻塞队列,有界队列,无界队列

在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。 使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用自旋+CAS的方式来实现。 基本概念 阻塞队列与非阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。 支持阻塞的插入方法offer:当队列满时,队列会阻塞插入元素的线程,直到队列不满

morris 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java队列实现(顺序队列、链式队列、循环队列)

1.顺序队列的实现 package lang; import java.io.Serializable; import java.util.Arrays; /** * @ClassName: ArrayQueue * @Description: 顺序队列 * @date 2014年1月20日 下午3:46:19 * @param */ public clas

jiutianhe的专栏 4万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

队列的使用及实现队列

队列的使用及实现队列的概念普通队列 Queue双端队列 Deque循环队列队列的使用插入元素 add offer删除元素 remove poll得到队头元素 element peek双端队列的使用插入删除得到队头队尾元素实现队列实现 Node定义队头和队尾向队列当中增加元素判断是否为空在队列当中弹出元素得到队头元素测试循环队列计算循环队列的下标图示第三种方法实现循环队列初始化入队判满判空出队得到队头元素得到队尾元素测试: 队列的概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,

sjp151的博客 5705

队列以及队列的应用

队列 队列的定义 生活中可能有很多种需要排队的场景,比如中午去食堂打饭,需要排队,排在队头的同学肯定是先去的,所以先打上饭。计算机中也有很多这样的场景,比如作业调度系统,如果同时来几个任务都需要用到输入输出系统,但是输入输出设备只有一套,谁先用呢,也是谁先来谁用,也需要排队。再比如我们的锁机制,如果出现多线程竞争同一把锁,那么同时只有一个线程获得了锁资源,剩下的线程怎么办呢,那如果是公平锁,肯定也是排队,等锁被释放了,那个最先来的线程优先获得锁资源。 那么根据上面的说法我们也大概了解了什么是队列。把他从生活

阿星的博客 5210

队列的基本操作(顺序队列、循环队列、链式队列)

&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 队列也是一种线性表,是一种先进先出的线性结构。队列只允许在表的一端进行插入(入队)、删除(出队)操作。允许插入的一端称为队尾,允许删除的一端称为队头。 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;队列的基本操作包括: 初始化队列:InitQueue(Q) &amp;nbsp; &

Keep Fighting All The Time 5万+

数组队列——循环队列

首先要明确队列的特点,先进先出,对头出队,队尾进队。其次通过数组对列探究对列的特性中设置了许多表示下标的变量,通过移动变量位置来实现入队出队;但实际上数组的值还是存在,只不过获取数据是通过arr[front]来获取。在研究普通数组队列时我们发现一旦队列满就再也无法存储数据的问题,因此出现了循环队列,通过取模来防止数组越界以此重复利用数组,只要出队取数据,保证数组队列中有空间,便可再次存数据,因此解决了这个问题。

include_java0的博客 1952
上一篇: 栈
下一篇: 一元多项式的乘法与加法运算
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值