关于栈的学习

数据结构-栈的灵活表示方式(栈顶指针和栈底指针) 在前面的文章中我们已经学习过基本栈的概念和操作,我们是通过“标准方式”数组的形式模拟了一个栈;本篇文章我将通过一种更灵活的方式定义栈以及实现栈的基本操作,废话不多说,直接上代码(注释都有说明哦) //栈的灵活表示法,通过定义栈顶指针和栈底指针的方式 #include <stdio.h> #include <stdlib.h> #define ElementType ... 阅读详情

栈的定义

1、栈是操作被限制的线性表,栈底不能操作,入栈和出栈的操作都在栈顶,一般用数组来表示,栈底就是下标为0的数组元素,另一头为栈顶。

2、栈分为两种,顺序栈和链栈,最主要的是顺序栈。

3、栈符合先进后出,后进先出的规则

一、顺序栈

1、结构

顺序栈的结构包含了数据项(数组)和指针项(数组下标),指针项称为栈顶指针top,通常栈顶指针top指向栈顶元素,那么就可以推出当栈顶指针top=(-1)时是个空栈。

2、顺序栈的操作

(1)栈结构的定义

typedef struct//栈体的定义
{
	int num[MAXSIZE];//栈元素的存储
	int top;//栈顶指针,为-1时为空栈,等于MAXSIZE-1时为满栈
}Sequen;

(2)栈的初始化操作

Sequen* Init(void)//栈的初始化,包括栈结构的内存申请,栈顶指针的初始赋值,返回栈结构的地址
{
	Sequen *st=(Sequen*)malloc(sizeof(Sequen));//申请结构体的空间大小,并把地址赋给st,申请失败会返回0
	st->top=-1;
	return st; 
}

(3)入栈

void pushsstack(Sequen* st,int data)//入栈
{
	if(!st || st->top==MAXSIZE-1)//判断栈结构是申请到空间或者是否满栈
	{
		printf("满了或没有栈体\n");
		return;
	}
	st->top++;//将栈顶指针往后移动一位
	st->num[st->top]=data;//将入栈的元素放入栈顶中
	return;
}

(4)出栈

int popsstack(Sequen* st)//出栈
{
	int i;
	if(!st || st->top==-1)//判断栈结构是申请到空间或者是否空栈
	{
		printf("满了或没有栈体\n");
		return 0;
	}
	i=st->num[st->top];//将要出栈的元素保存在i中
	st->top--;//栈顶指针往前移动一位
	return i;
}

(5)取栈顶元素

int qusstack(Sequen* st)//取栈顶元素
{
	int i;
	if(!st || st->top==-1)
	{
		printf("满了或没有栈体\n");
		return 0;
	}
	i=st->num[st->top];//注意:此时不需要改变栈顶的指针位置
	return i;
}

(6)判断栈空

void kosstack(Sequen* st)//判断空栈
{
	if(st->top==-1)//如果栈顶指针等于-1则
	{
		printf("空\n");
	}
	else if(!st)//如果没有申请成功栈体则
		printf("没有栈体\n");
	return;
}

(7)清除栈

void clearsstack(Sequen* st)//清除栈
{
	st->top=-1;//将栈顶指针复位-1
	return;
}

(8)栈的调试

void main()
{
	int i;
	Sequen* st;//定义栈体指针
	st=Init();//栈的初始
	kosstack(st);//判断栈空,此时应该为空
	pushsstack(st,100);//入栈
	i=popsstack(st);//出栈
	pushsstack(st,200);//入栈
	i=qusstack(st);//取栈顶元素
	printf("%d \n",i);
}

3、总程序

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 5
typedef struct//栈体的定义
{
	int num[MAXSIZE];//栈元素的存储
	int top;//栈顶指针,为-1时为空栈,等于MAXSIZE-1时为满栈
}Sequen;
Sequen* Init(void)//栈的初始化,包括栈结构的内存申请,栈顶指针的初始赋值,返回栈结构的地址
{
	Sequen *st=(Sequen*)malloc(sizeof(Sequen));//申请结构体的空间大小,并把地址赋给st,申请失败会返回0
	st->top=-1;
	return st; 
}
void pushsstack(Sequen* st,int data)//入栈
{
	if(!st || st->top==MAXSIZE-1)//判断栈结构是申请到空间或者是否满栈
	{
		printf("满了或没有栈体\n");
		return;
	}
	st->top++;//将栈顶指针往后移动一位
	st->num[st->top]=data;//将入栈的元素放入栈顶中
	return;
}
int popsstack(Sequen* st)//出栈
{
	int i;
	if(!st || st->top==-1)//判断栈结构是申请到空间或者是否空栈
	{
		printf("满了或没有栈体\n");
		return 0;
	}
	i=st->num[st->top];//将要出栈的元素保存在i中
	st->top--;//栈顶指针往前移动一位
	return i;
}
int qusstack(Sequen* st)//取栈顶元素
{
	int i;
	if(!st || st->top==-1)
	{
		printf("满了或没有栈体\n");
		return 0;
	}
	i=st->num[st->top];//注意:此时不需要改变栈顶的指针位置
	return i;
}
void kosstack(Sequen* st)//判断空栈
{
	if(st->top==-1)//如果栈顶指针等于-1则
	{
		printf("空\n");
	}
	else if(!st)//如果没有申请成功栈体则
		printf("没有栈体\n");
	return;
}
void clearsstack(Sequen* st)//清除栈
{
	st->top=-1;//将栈顶指针复位-1
	return;
}
void main()
{
	int i;
	Sequen* st;//定义栈体指针
	st=Init();//栈的初始
	kosstack(st);//判断栈空,此时应该为空
	pushsstack(st,100);//入栈
	i=popsstack(st);//出栈
	pushsstack(st,200);//入栈
	i=qusstack(st);//取栈顶元素
	printf("%d \n",i);
}

二、链栈

1、结构

链栈就是链表,将链表的头指针看成栈顶指针,去掉头节点,用链表的头插法实现栈的出入即可

2、链栈的操作

(1)栈节点结构及栈的维护定义

//定义链的节点的结构体
typedef struct linkst
{
	int data;//数据域
	struct linkst *next;//指针域
}Listnode;
//链栈的维护结构
typedef struct
{
	int num;//栈的计数
	struct linkst *top;//栈顶指针
}safeg;

(2)栈的初始化操作

safeg* Init()//返回的是维护结构的地址
{
	safeg* st=(safeg*)malloc(sizeof(safeg));//申请维护结构内存
	st->num=0;//将栈元素的计数清0
	st->top=NULL;//栈顶指针指向NULL,避免野指针
	return st;//返回维护结构的地址
}

(3)入栈

void pushstack(safeg *st,int n)//输入维护(操作)的结构体地址和入栈的数据
{
	Listnode* tmp;//定义一个指向结构体节点的指针
	if(!st)//如果申请的维护结构失败了,没钱不干了
	{
		printf("链栈的维护结构未创建\n");
		return;
	}
	tmp =(Listnode*)malloc(sizeof(Listnode));//申请链的节点的内存
	if(st->num==0 || st->top==NULL)//如果是空栈,即第一次入栈
	{
		st->top=tmp;//先将栈顶指针 指向新申请的第一个节点地址
		tmp->data=n;//将入栈的数据放入第一个节点
		tmp->next=NULL;//头插法,将第一个的节点的指针域置为NULL
		st->num++;//将栈计数器加一
		return;//函数返回
	}
	else//不是第一次入栈
	{
		tmp->data=n;//将入栈的数据放入节点
		tmp->next=st->top;//将新的节点的指针域指向栈顶指针
		st->top=tmp;//将栈顶指针指向新的节点
		st->num++;//将栈计数器加一
	}
}

(4)出栈

int popstack(safeg *st)//返回出栈的数据
{
	int i;
	Listnode* tmp;//定义结构体节点的指针
	if(!st || st->num==0 || st->top==NULL)//判断是否申请了维护结构的内存或者为空栈
	{
		printf("非法!\n");
		return 0;
	}
	tmp=st->top;//将结构体的指针指向栈顶指针同个地址(要出栈的地址)
	i=tmp->data;//将要出栈的数据保存
	st->top=tmp->next;//将栈顶指针移向下一个链节点
	(st->num)--;//将栈计数器减一
	tmp->next=NULL;//将出栈节点的指针域指向NULL
	free(tmp);//释放出栈的节点
	tmp=NULL;//避免野指针
	return i;//返回出栈节点的数据
}

(5)取栈顶元素

//取栈顶元素
int getstack(safeg *st)//和出栈类似,但是栈顶指针不用移动
{
	int n;
	if(!st || (st->top==NULL) || st->num==0)
	{
		printf("非法!\n");
		return 0;
	}
	n=(st->top)->data;
	return n;
}

(6)判断栈空

void kostack(safeg *st)
{
	if(!st || (st->top==NULL) || st->num==0)
	{
		printf("非法!\n");
	}
}

(7)清除栈

void clearstack(safeg *st)
{
	Listnode *p1,*p2;//定义两个链节点的指针
	if(!st || (st->top==NULL) || st->num==0)//判栈空
	{
		return;
	}
	p1=st->top;//将p1指向栈顶指针的节点地址(要删除的节点地址)
	p2=p1->next;//p2指向下一个节点
	while(p1!=NULL)//只要栈顶指针不为空
	{
		st->top=p2;//将栈顶指针移动到下一个节点位置
		p1->next=NULL;//将要删除节点的指针域指向NULL1
		free(p1);//释放要删除的节点
		p1=NULL;//避免野指针
		p1=p2;
		if(p2) p2=p1->next;//如果p2指向不为NULL,则将p2移动到下一个节点
		else  p2=NULL;//否则,p2为NULL
		st->num--;//将栈计数器减一
	}
}

(8)栈的调试

void main()
{
	int i,n;
	safeg* st;
	st=Init();
	pushstack(st,100);
	pushstack(st,200);
	pushstack(st,300);
	printf("栈的元素个数:%d\n",st->num);
	/*for(i=0;i<4;i++)
	{
		n=popstack(st);
		printf("%d ",n);
	}*/
	clearstack(st);
	printf("栈的元素个数:%d\n",st->num);
}

三、总程序

#include<stdio.h>
#include<stdlib.h>
//定义链的节点的结构体
typedef struct linkst
{
	int data;//数据域
	struct linkst *next;//指针域
}Listnode;

//链栈的维护结构
typedef struct
{
	int num;//栈的计数
	struct linkst *top;//栈顶指针
}safeg;

//链栈维护的初始化
safeg* Init()//返回的是维护结构的地址
{
	safeg* st=(safeg*)malloc(sizeof(safeg));//申请维护结构内存
	st->num=0;//将栈元素的计数清0
	st->top=NULL;//栈顶指针指向NULL,避免野指针
	return st;//返回维护结构的地址
}

//入栈
void pushstack(safeg *st,int n)//输入维护(操作)的结构体地址和入栈的数据
{
	Listnode* tmp;//定义一个指向结构体节点的指针
	if(!st)//如果申请的维护结构失败了,没钱不干了
	{
		printf("链栈的维护结构未创建\n");
		return;
	}
	tmp =(Listnode*)malloc(sizeof(Listnode));//申请链的节点的内存
	if(st->num==0 || st->top==NULL)//如果是空栈,即第一次入栈
	{
		st->top=tmp;//先将栈顶指针 指向新申请的第一个节点地址
		tmp->data=n;//将入栈的数据放入第一个节点
		tmp->next=NULL;//头插法,将第一个的节点的指针域置为NULL
		st->num++;//将栈计数器加一
		return;//函数返回
	}
	else//不是第一次入栈
	{
		tmp->data=n;//将入栈的数据放入节点
		tmp->next=st->top;//将新的节点的指针域指向栈顶指针
		st->top=tmp;//将栈顶指针指向新的节点
		st->num++;//将栈计数器加一
	}
}

//出栈
int popstack(safeg *st)//返回出栈的数据
{
	int i;
	Listnode* tmp;//定义结构体节点的指针
	if(!st || st->num==0 || st->top==NULL)//判断是否申请了维护结构的内存或者为空栈
	{
		printf("非法!\n");
		return 0;
	}
	tmp=st->top;//将结构体的指针指向栈顶指针同个地址(要出栈的地址)
	i=tmp->data;//将要出栈的数据保存
	st->top=tmp->next;//将栈顶指针移向下一个链节点
	(st->num)--;//将栈计数器减一
	tmp->next=NULL;//将出栈节点的指针域指向NULL
	free(tmp);//释放出栈的节点
	tmp=NULL;//避免野指针
	return i;//返回出栈节点的数据
}

//取栈顶元素
int getstack(safeg *st)//和出栈类似,但是栈顶指针不用移动
{
	int n;
	if(!st || (st->top==NULL) || st->num==0)
	{
		printf("非法!\n");
		return 0;
	}
	n=(st->top)->data;
	return n;
}

//判断栈空
void kostack(safeg *st)
{
	if(!st || (st->top==NULL) || st->num==0)
	{
		printf("非法!\n");
	}
}

//清除栈
void clearstack(safeg *st)
{
	Listnode *p1,*p2;//定义两个链节点的指针
	if(!st || (st->top==NULL) || st->num==0)//判栈空
	{
		return;
	}
	p1=st->top;//将p1指向栈顶指针的节点地址(要删除的节点地址)
	p2=p1->next;//p2指向下一个节点
	while(p1!=NULL)//只要栈顶指针不为空
	{
		st->top=p2;//将栈顶指针移动到下一个节点位置
		p1->next=NULL;//将要删除节点的指针域指向NULL1
		free(p1);//释放要删除的节点
		p1=NULL;//避免野指针
		p1=p2;
		if(p2) p2=p1->next;//如果p2指向不为NULL,则将p2移动到下一个节点
		else  p2=NULL;//否则,p2为NULL
		st->num--;//将栈计数器减一
	}
}

//主函数
void main()
{
	int i,n;
	safeg* st;
	st=Init();
	pushstack(st,100);
	pushstack(st,200);
	pushstack(st,300);
	printf("栈的元素个数:%d\n",st->num);
	/*for(i=0;i<4;i++)
	{
		n=popstack(st);
		printf("%d ",n);
	}*/
	clearstack(st);
	printf("栈的元素个数:%d\n",st->num);
}

从搬砖工到架构师,Java全栈学习路线总结 Java 全栈开发技术是一种整合多种技术的开发方式,涉及众多领域,如:前端、后端、数据库等。Java 全栈开发技术的全面普及,使得该领域成为了就业和职业发展的焦点。为了快速入门 Java 全栈开发,我们可以从下面的路线开始学习。 Java 全栈开发需要不断地学习和实践,掌握优秀的编程习惯和实现技巧非常重要。在 Java 全栈开发的旅途中,我们需要关注技术的动态发展,随时更新自己的技能和知识体系。 阅读详情

相关推荐

切比雪夫插值

切比雪夫插值是一种基于切比雪夫节点的多项式插值方法,其优势是减少插值误差(特别是龙格现象:表现为高维插值时在边缘处插值误差骤增)。本文对其基本操作进行说明。

平和少年的博客 1647

数据结构:栈的学习

一、栈 1.1 概念 1.2 栈的使用 1.3 示例 二、栈的应用场景 2.1 改变元素的序列 2.2逆波兰表达式求值 2.3 括号匹配 2.4 栈的压入、弹出序列

m0_65683419的博客 3413

三维变换矩阵实战——三维点云的旋转、缩放、镜像、错切、平移、正交投影

旋转矩阵:右边矩阵是点云的原始坐标,左边的是旋转矩阵可视化:绕x轴旋转90度。

weixin_43850909的博客 8230

【数据结构】栈的基本知识详解

【数据结构】第三章——栈、队列和数组(1) 详细介绍了栈的基本概念与基本操作……

蒙奇D索大的博客 2749

Dobot Magician机械臂二次开发指南:如何利用Python脚本和I/O接口实现自动化任务

本文详细介绍了Dobot Magician机械臂的二次开发方法,重点讲解如何通过Python脚本和I/O接口实现高级自动化任务。内容包括开发环境搭建、运动控制API解析、I/O接口应用以及典型场景实现,帮助开发者充分发挥Dobot Magician的潜力,适用于工业自动化、教育科研等领域。

weixin_26968079的博客 267

YOLOv12改进策略【注意力机制篇】| 添加SE、CBAM、ECA、CA、Swin Transformer等注意力和多头注意力机制

这篇文章带来一个经典注意力模块的汇总,虽然有些模块已经发布很久了,但后续的注意力模块也都是在此基础之上进行改进的,对于初学者来说还是有必要去学习了解一下,以加深对模块,模型的理解。

Limiiiing的博客 1511

【数据结构】栈(Stack)超详细教学

栈:是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。栈中的元素遵守后进先出 LIFO(Last in First Out)的原则。

2401_87820834的博客 7546

把 SAP Activate 六个阶段看透:从项目落地到 SAP BTP 扩展与 AI 运营的一体化实践

摘要: SAP Activate 方法论常被误解为简单的项目阶段划分,实则是一套将业务目标、标准流程、系统配置和持续运营串联的实施控制体系。其六个阶段(Discover至Run)构成价值递进的实施通道,核心交付集中在Prepare到Deploy阶段。Discover阶段通过DDA评估确立项目方向与范围,Prepare阶段聚焦可执行性准备,Explore阶段采用Fit-to-Standard工作坊进行需求分层,Realize阶段基于前期决策进行配置与扩展开发。该方法论强调标准化优先,差异化需求通过SAP BT

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2332

栈的学习

1.栈的定义 栈(stack)是限制仅在表一端进行插入或删除操作的线性表。 (1)通常称插入或删除的一端为栈顶(Top),另一端为栈底(Bottom) (2)当表中没有元素时称为空栈 (3)栈为后进先出(last in first out)线性表,也称为LIFO表 2.顺序栈 顺序栈的类型定义 #define stacksize 1000; //预分配的栈的空间最多为1000个...

系统运维 228

8、 使用TPM密钥:从理论到实践的全面指南

本文全面介绍了如何使用TPM(可信平台模块)进行密钥管理,涵盖密钥的创建、存储、加载、迁移以及特殊密钥类型的使用。通过详细的操作步骤和代码示例,帮助读者掌握TPM密钥管理技术,确保系统的安全性和可靠性。

weixin_36212459的博客 242

【nvidia-B200】实际生产报错NVRM: nvAssertFailedNoLog: Assertion failed: pIOVAS != NULL @ io_vaspace.c:601

升级 NVIDIA 驱动到 R545/R550 数据中心版本(解决 IOVA bug,这是性能差的根本原因);重启服务器(清理驱动残留资源,消除日志中的 NVRM 错误);验证 NVLink/PCIe 链路(确保 8 卡互联使用高速链路,而非单卡 PCIe 共享带宽)。完成这 3 步后,ncccl-test的all_reduce带宽应能提升至100GB/s 以上(取决于服务器的 NVLink/NVSwitch 配置),恢复正常性能。

jundao1997的专栏 652

全栈开发:学习路线

全栈开发需要掌握多种编程语言和技术,包括前端、后端和数据库等领域。在学习过程中,需要有耐心和毅力,不断练习和实践。只有不断地探索和尝试,才能在全栈开发领域不断进步。

m0_72410588的博客 2922

Algorithm:【算法进阶之路】之算法面试刷题集合—数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构【元素/关系】、数据运算【十大排序/四大查找-图三大搜索-

​ Algorithm:【算法进阶之路】之算法面试刷题集合—数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构【元素/关系】、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】、高级算法【枚举/回溯/递归/分治/动规/贪心】)、问题为导向的十大类刷题算法总结之详细攻略 目录 相关文章 数据结构思维导图 基本术语 一、数据结构的概述 二、数据的逻辑结构 三、数据的物理结构 四、数据的运算

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 6849

全栈开发学习路径

全栈开发是指能够同时胜任前端和后端开发的技能组合,是现代软件开发领域的重要角色。选择这条路径意味着你需要掌握从用户界面到服务器、数据库的全面技术。虽然学习曲线相对陡峭,但全栈开发者的综合能力和灵活性在就业市场上极具竞争力。成功的学习路径通常遵循循序渐进的原则,从基础到高级,逐步构建完整的知识体系。关键在于保持学习的连续性和实践性,通过实际项目将分散的知识点串联起来,形成真正的开发能力。

shichen19950724的博客 434

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

全栈学习路线

目标:掌握基础的编程逻辑、交互效果和前端动态功能。

weixin_44463519的博客 1223

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

2024最新Python全栈工程师学习路线

首先,对于没有学习方向,知识不体系的人,我把我工作几年整理的学习路线分享给大家,做一个借鉴作用,还不知道怎么学习的人可以直接照着我这个学习路线一个个的去学习,知识不体系的人可以参考下我整理路线的方式,总之希望能够帮到你们!

2401_85428892的博客 3335

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python全栈学习路线

人工智能时代,想要从事编程行业,最佳的学习语言是什么?当然是Python!Python入门简单、功能强大,已成为各大企业首选开发语言,也吸引了无数有志学子投身学习。下面是小编为您整理的关于python全栈学习路线,希望对你有所帮助。 何系统的自学Python? 幸运的是,Python 是一门初学者友好的编程语言,想要完全掌握它,你不必花上太多的时间和精力。 在这里还是要推荐下我自己建的Python...

python零基础入门 695

java全栈学习路线

首先呢学习JAVA要拥有一个好的学习方向和学习路线,接下啦分7个阶段给大家总结!

qq_40749830的博客 655

栈的学习笔记

【代码】栈的学习笔记。

2301_79790385的博客 272

数据结构-栈的学习

今天把顺序栈学习了,把代码分享一下,如有问题请留言指出,希望和大家共同进步。 代码如下: #include "stdio.h" typedef int SElemType; typedef int Status; #define MAXSIZE 100 #define OK 1 #define ERROR 0 typedef struct { SElemType *base;//...

想飞上天的胖子 268

一张图带你理清Java全栈学习路线

Java的学习没有捷径可走,最重要的是多写多练,坚持再坚持????。 参考内容:b站狂神说Java系列课程

筱寒小记 3021

Java全栈学习路线

Java全栈学习路线 一、java基础 二、Java web 三、SSM框架 四、Linux 运维 五、微服务和分布式 六、大数据开发 七、持续学习 八、学习路径以及相对应的链接 JavaSE入门 https://www.bilibili.com/video/BV12J41137hu GUI编程入门到游戏实战 https://www.bilibili.com/video/BV1DJ411B75F 网络编程实战讲解 https://www.bilibili.com/video/BV1LJ411

m0_52228020的博客 900
上一篇: 顺序表的学习
下一篇: 关于队列的学习
甘甜的话梅
博客等级 码龄7年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值