C语言-栈和队列

news2024/11/13 10:53:37

在这里插入图片描述

文章目录

  • 🎯引言
  • 👓栈和队列
    • 1.栈
      • 1.1栈的概念与结构
      • 1.2栈的实现
    • 2.队列
      • 2.1队列的概念与结构
      • 2.2队列的实现
  • 🥇结语

🎯引言

欢迎来到HanLop博客的C语言数据结构初阶系列。在之前的文章中,我们详细介绍了链表及其操作方法。在本篇文章中,我们将深入探讨栈和队列这两种常见的数据结构。栈和队列虽然都是线性数据结构,但它们在数据的存取方式上有着显著的区别。栈是一种后进先出(LIFO, Last In First Out)的数据结构,而队列则是一种先进先出(FIFO, First In First Out)的数据结构。通过理解和掌握这两种数据结构,您将能更有效地管理数据,并为后续更复杂的数据结构和算法的学习打下坚实的基础。让我们一起开始探索栈和队列的奥秘吧!

👓栈和队列

1.栈

1.1栈的概念与结构

栈(Stack)是一种特殊的线性数据结构,它遵循“后进先出”(LIFO, Last In First Out)的原则。这意味着在栈中,最后一个被插入的数据将是第一个被取出的数据。

栈顶和栈底

栈顶和栈底是栈结构中两个重要的概念:

  • 栈顶(Top): 栈顶是指栈中最后一个被插入的元素的位置。在执行压栈(Push)和出栈(Pop)操作时,都是针对栈顶进行的。因此,栈顶是栈中唯一可以进行插入和删除操作的地方。
  • 栈底(Bottom): 栈底是指栈中第一个被插入的元素的位置。在一个空栈中,栈底和栈顶的指针都是相同的。随着新的元素不断压入栈中,栈顶的位置会发生变化,但栈底的位置始终保持不变。

图示结构:

在这里插入图片描述

1.2栈的实现

栈的实现主要有两种方式:

  1. 数组实现: 使用数组来存储栈中的元素。用数组相较于用链表更优一些
  2. 链表实现: 使用链表来存储栈中的元素。

Stack.h源码

//Stack.h文件中
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>

typedef int StackDataType;
typedef struct Stack
{
	StackDataType* arr;
	int top;
	int capacity;
}Stack;

//初始栈
void StackInit(Stack* ps);

//销毁栈
void StackDestory(Stack* ps);

//入栈
void StackPush(Stack* ps, StackDataType	x);

//判断栈是否为空
bool IsEmpty(Stack* ps);

//取出栈顶元素
StackDataType StackTop(Stack* ps);

//获取链表有效个数
int StackSize(Stack* ps);

//出栈
void StackPop(Stack* ps);

Stack.c源码

#include "Stack.h"

//初始栈
void StackInit(Stack* ps)
{
	assert(ps);
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}

//入栈
void StackPush(Stack* ps, StackDataType	x)
{
	assert(ps);
	//检查容量

	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		StackDataType* tmp = (StackDataType*)realloc(ps->arr,sizeof(StackDataType) * newcapacity);

		if (tmp != NULL)
		{
			ps->arr = tmp;
			ps->capacity = newcapacity;
		}
		else
		{
			exit(1);
		}
	}

	ps->arr[ps->top] = x;
	ps->top++;
}
//判断栈是否为空
bool IsEmpty(Stack* ps)
{
	return ps->top == 0;
}

//出栈
void StackPop(Stack* ps)
{
	assert(ps);
	assert(!IsEmpty(ps));

	ps->top--;
}

//取出栈顶元素
StackDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!IsEmpty(ps));

	return ps->arr[ps->top - 1];
}

//获取链表有效个数
int StackSize(Stack* ps)
{
	return ps->top;
}

//销毁
void StackDestory(Stack* ps)
{
	assert(ps);
	free(ps->arr);
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}

函数实现详解:

1. 初始化栈 StackInit(Stack* ps)

void StackInit(Stack* ps)
{
    assert(ps);
    ps->arr = NULL;
    ps->capacity = ps->top = 0;
}

功能

初始化栈,确保栈的所有成员变量都有合理的初始值。

实现细节

  • 使用 assert(ps) 检查传入的栈指针 ps 是否为 NULL
  • 将栈的数组指针 arr 设为 NULL,表示栈中没有元素。
  • 将栈的容量 capacity 和栈顶指针 top 都设为 0,表示栈是空的。

2. 入栈 StackPush(Stack* ps, StackDataType x)

void StackPush(Stack* ps, StackDataType x)
{
    assert(ps);
    // 检查容量
    if (ps->top == ps->capacity)
    {
        int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        StackDataType* tmp = (StackDataType*)realloc(ps->arr, sizeof(StackDataType) * newcapacity);

        if (tmp != NULL)
        {
            ps->arr = tmp;
            ps->capacity = newcapacity;
        }
        else
        {
            exit(1);
        }
    }

    ps->arr[ps->top] = x;
    ps->top++;
}

功能

将一个元素压入栈顶,如果栈的容量不足,则动态扩展栈的容量。

实现细节

  • 使用 assert(ps) 检查传入的栈指针 ps 是否为 NULL
  • 检查栈的容量是否足够,如果栈顶指针 top 等于当前容量 capacity,表示容量已满。
  • 如果容量已满,计算新的容量:如果当前容量为 0,则设为 4,否则容量翻倍。
  • 使用 realloc 动态分配新的内存空间,并将原有元素复制到新空间。
  • 检查 realloc 是否成功,如果成功则更新栈的数组指针 arr 和容量 capacity,否则退出程序。
  • 将新元素放入栈顶位置,并更新栈顶指针 top

3. 判断栈是否为空 IsEmpty(Stack* ps)

bool IsEmpty(Stack* ps)
{
    return ps->top == 0;
}

功能

检查栈是否为空。

实现细节

  • 检查栈顶指针 top 是否为 0,如果是,则表示栈为空,返回 true,否则返回 false

4. 出栈 StackPop(Stack* ps)

void StackPop(Stack* ps)
{
    assert(ps);
    assert(!IsEmpty(ps));

    ps->top--;
}

功能

从栈顶移除一个元素。

实现细节

  • 使用 assert(ps) 检查传入的栈指针 ps 是否为 NULL
  • 使用 assert(!IsEmpty(ps)) 确保栈不为空,否则操作无效。
  • 将栈顶指针 top 减一,表示移除了栈顶元素。

5. 取出栈顶元素 StackTop(Stack* ps)

StackDataType StackTop(Stack* ps)
{
    assert(ps);
    assert(!IsEmpty(ps));

    return ps->arr[ps->top - 1];
}

功能

返回栈顶元素的值,但不移除该元素。

实现细节

  • 使用 assert(ps) 检查传入的栈指针 ps 是否为 NULL
  • 使用 assert(!IsEmpty(ps)) 确保栈不为空,否则操作无效。
  • 返回栈顶元素,即数组中索引为 top - 1 位置的元素。

6. 获取栈中有效元素个数 StackSize(Stack* ps)

int StackSize(Stack* ps)
{
    return ps->top;
}

功能

返回栈中当前元素的个数。

实现细节

  • 直接返回栈顶指针 top 的值,因为 top 指示了栈中元素的个数。

7. 销毁栈 StackDestory(Stack* ps)

void StackDestory(Stack* ps)
{
    assert(ps);
    free(ps->arr);
    ps->arr = NULL;
    ps->capacity = ps->top = 0;
}

功能

释放栈的内存,并重置栈的所有成员变量。

实现细节

  • 使用 assert(ps) 检查传入的栈指针 ps 是否为 NULL
  • 使用 free 释放栈的数组指针 arr 指向的内存。
  • arr 设为 NULL,防止悬空指针。
  • 将栈的容量 capacity 和栈顶指针 top 都设为 0,重置栈。

2.队列

2.1队列的概念与结构

队列(Queue)是一种线性数据结构,它遵循“先进先出”(FIFO, First In First Out)的原则。队列中的元素总是从队尾插入,从队头删除。换句话说,第一个插入的元素也是第一个被删除的元素。

队头和队尾

  • 队头(Front): 队头是指队列中最早插入的元素所在的位置。在执行出队(Dequeue)操作时,元素从队头移除。
  • 队尾(Rear): 队尾是指队列中最后插入的元素所在的位置。在执行入队(Enqueue)操作时,元素插入到队尾。

图示:

在这里插入图片描述

2.2队列的实现

队列的实现主要有两种方式:

  1. 数组实现: 使用数组来存储队列中的元素。出队的时候要移动数据,时间复杂度较高不建议使用
  2. 链表实现: 使用链表来存储队列中的元素。出队时间复杂度O(1),下面将会用链表的方式实现队列

Queue.h源码

//Queue.h文件中
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
typedef int QueueDataType;
typedef struct QueueNode
{
	QueueDataType x;
	struct QueueNode* next;
}QueueNode;
typedef struct Queue
{
	QueueNode* phead;
	QueueNode* ptail;
	int size;
}Queue;

//初始化队列
void QueueInit(Queue* pq);

//队列判空
bool QueueEmpty(Queue* pq);

//入队列,队尾
void QueuePush(Queue* pq, QueueDataType x);

//出队列,队头
void QueuePop(Queue* pq);

//取队头数据
QueueDataType QueueFront(Queue* pq);

//取队尾数据
QueueDataType QueueBack(Queue* pq);

//队列的有效个数
int QueueSize(Queue* pq);

定义数据类型

typedef int QueueDataType;

功能: 定义队列数据类型。
说明: 使用 typedefint 类型定义为 QueueDataType,这样如果以后需要更改队列存储的数据类型,只需要修改这一行即可。

定义队列节点结构体

typedef struct QueueNode
{
    QueueDataType x;
    struct QueueNode* next;
} QueueNode;

功能: 定义队列节点结构体。
说明:

  • QueueDataType x:存储节点数据。
  • struct QueueNode* next:指向下一个节点的指针。

定义队列结构体

typedef struct Queue
{
    QueueNode* phead;
    QueueNode* ptail;
    int size;
} Queue;

功能: 定义队列结构体。
说明:

  • QueueNode* phead:指向队列头部节点的指针。
  • QueueNode* ptail:指向队列尾部节点的指针。
  • int size:记录队列中元素的个数。

Queue.c源码

//Queue.c文件中
#include "Queue.h"

//初始化队列
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->size = 0;
	pq->phead = pq->ptail = NULL;

}

//队列判空
bool QueueEmpty(Queue* pq)
{
	return pq->phead == NULL;
}

//入队列,队尾
void QueuePush(Queue* pq, QueueDataType x)
{
	assert(pq);
	QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
	newNode->next = NULL;
	newNode->x = x;

	if (newNode == NULL)
	{
		perror("malloc fail");
		exit(1);
	}

	if ((pq->phead == NULL)&&(pq->ptail==NULL))
	{
		pq->phead = pq->ptail = newNode;
	}
	else
	{
		pq->ptail->next = newNode;
		pq->ptail = pq->ptail->next;
	}

	pq->size++;
}

//出队列,队头
void QueuePop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));

	QueueNode* del = pq->phead;
	if (pq->phead == pq->ptail)
	{
		pq->phead = pq->ptail = NULL;
		free(del);
		del = NULL;
	}
	else
	{
		pq->phead = pq->phead->next;
		free(del);
		del = NULL;
	}

	pq->size--;
}

//取队头数据
QueueDataType QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->phead->x;
}

//取队尾数据
QueueDataType QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->ptail->x;
}


//队列的有效个数
int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

函数实现详解

1. QueueInit

void QueueInit(Queue* pq)
{
    assert(pq);
    pq->size = 0;
    pq->phead = pq->ptail = NULL;
}

功能: 初始化队列,将队列的头指针和尾指针都设为 NULL,并将队列大小设为 0。
参数: Queue* pq:指向队列结构体的指针。
返回值: 无。

实现过程:

  • 使用 assert 确保传入的指针不为空。
  • 将队列的头指针和尾指针都设为 NULL
  • 将队列的大小设为 0。

2. QueueEmpty

bool QueueEmpty(Queue* pq)
{
    return pq->phead == NULL;
}

功能: 检查队列是否为空。
参数: Queue* pq:指向队列结构体的指针。
返回值: bool:如果队列为空,返回 true;否则返回 false

实现过程:

  • 检查队列的头指针是否为 NULL。如果是,则队列为空,返回 true;否则返回 false

3. QueuePush

void QueuePush(Queue* pq, QueueDataType x)
{
    assert(pq);
    QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
    newNode->next = NULL;
    newNode->x = x;

    if (newNode == NULL)
    {
        perror("malloc fail");
        exit(1);
    }

    if ((pq->phead == NULL) && (pq->ptail == NULL))
    {
        pq->phead = pq->ptail = newNode;
    }
    else
    {
        pq->ptail->next = newNode;
        pq->ptail = pq->ptail->next;
    }

    pq->size++;
}

功能: 将新元素插入到队列的尾部。
参数: Queue* pq:指向队列结构体的指针;QueueDataType x:要插入的元素。
返回值: 无。

实现过程:

  • 使用 assert 确保传入的指针不为空。
  • 使用 malloc 分配一个新的节点,并检查内存分配是否成功。如果分配失败,打印错误信息并退出程序。
  • 将新节点的 next 指针设为 NULL,并将数据 x 存储在新节点中。
  • 检查队列是否为空(头指针和尾指针都为 NULL),如果为空,将新节点设为头节点和尾节点。
  • 如果队列不为空,将新节点添加到队列尾部,并更新尾指针。
  • 增加队列的大小。

4. QueuePop

void QueuePop(Queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));

    QueueNode* del = pq->phead;
    if (pq->phead == pq->ptail)
    {
        pq->phead = pq->ptail = NULL;
    }
    else
    {
        pq->phead = pq->phead->next;
    }
    free(del);
    pq->size--;
}

功能: 删除队列头部的元素。
参数: Queue* pq:指向队列结构体的指针。
返回值: 无。

实现过程:

  • 使用 assert 确保传入的指针不为空且队列不为空。
  • 保存头节点的指针。
  • 如果头节点和尾节点相同,将头尾指针都设为 NULL
  • 否则,将头指针指向下一个节点。
  • 释放头节点的内存,并减少队列大小。

5. QueueFront

QueueDataType QueueFront(Queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->phead->x;
}

功能: 获取队列头部的元素,但不删除。
参数: Queue* pq:指向队列结构体的指针。
返回值: QueueDataType:队列头部的元素。

实现过程:

  • 使用 assert 确保传入的指针不为空且队列不为空。
  • 返回头节点的数据。

6. QueueBack

QueueDataType QueueBack(Queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->ptail->x;
}

功能: 获取队列尾部的元素,但不删除。
参数: Queue* pq:指向队列结构体的指针。
返回值: QueueDataType:队列尾部的元素。

实现过程:

  • 使用 assert 确保传入的指针不为空且队列不为空。
  • 返回尾节点的数据。

7. QueueSize

int QueueSize(Queue* pq)
{
    assert(pq);
    return pq->size;
}

功能: 获取队列中的元素个数。
参数: Queue* pq:指向队列结构体的指针。
返回值: int:队列的大小。

实现过程:

  • 使用 assert 确保传入的指针不为空。
  • 返回队列的大小。

🥇结语

通过本篇文章的学习,我们了解了栈和队列的基本概念、操作方法及其应用场景。栈作为后进先出的数据结构,常用于递归算法和回溯问题的解决,而队列作为先进先出的数据结构,则在任务调度和广度优先搜索中有着重要应用。希望通过本文的讲解,您能掌握栈和队列的使用技巧,并在实际编程中灵活应用。下一篇文章,我们将继续探讨更为复杂的数据结构,敬请期待!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW多线圈电磁式振动发电机测试

开发了一种基于LabVIEW设计的多线圈电磁式振动发电机测试系统。系统通过高效的数据采集、波峰检测及相位差计算&#xff0c;优化了传统振动发电机的测试流程&#xff0c;提升了电压波形分析的精度和效率&#xff0c;具有较好的应用前景和推广价值。 项目背景 随着可再生能源技…

【python】Numpy运行报错详细分析:IndexError: too many indices for array

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; HadoopHDFSMapReduceHiveFlumeSqoopZookeeperHBase 正在 章节内容 上一节我们完成了&#xff1a; HBase …

docker tomcat 404

HTTP 404状态码表示“Not Found”&#xff0c;即服务器无法找到请求的页面。 当用户尝试访问一个不存在的网页时&#xff0c;服务器会返回这个状态码。这个状态码是HTTP协议的一部分&#xff0c;用于告知客户端&#xff08;通常是浏览器&#xff09;服务器无法完成请求。404状…

springboot校园跑腿服务系统-计算机毕业设计源码15157

摘要 本文介绍了一种基于Springboot和uniapp的校园跑腿服务系统的设计与实现。该系统旨在为大学校园提供一种方便快捷的跑腿服务&#xff0c;满足学生和教职员工的日常需求。首先&#xff0c;系统采用了Springboot作为后端框架&#xff0c;利用其轻量级、高效的特性&#xff0c…

抖音短视频seo矩阵系统源码开发技术分享(二)--SaaS开源

目录 市场背景分析 一、抖音短视频seo矩阵系统开发部署流程 二、 源码开发功能构思 三、 抖音短视频seo源码开发部署注意事项 四、 部分开发代码展示 市场背景分析 抖音短视频seo矩阵系统是通过不同平台不同账号之间建立联系&#xff0c;通过将同一品牌下不同平台不同账号…

操作系统(3)——内存管理

目录 小程一言专栏链接: [link](http://t.csdnimg.cn/6grrU)内存管理无存储器抽象存储器抽象实现以下几方面小结 虚拟内存实现以下方面总结 页面置换算法概述常见的页面置换算法先进先出&#xff08;FIFO&#xff09;算法最近最少使用&#xff08;LRU&#xff09;算法总结 小程…

idea如何让包结构分层

文章目录 前言1.选中前项目包结构2.取消后项目包结构3.情况二 前言 在大型项目中&#xff0c;代码的分层管理至关重要。IDEA编辑器提供了强大的package分层结构功能&#xff0c;帮助开发者更好地组织和管理代码。通过合理配置&#xff0c;我们可以清晰地看到各个package之间的…

Stable Diffusion 使用详解(1)---- 提示词及相关参数

目录 背景 提示词 内容提示词 人物及主体特征 场景 环境光照 画幅视角 注意事项及示例 标准化提示词 画质等级 风格与真实性 具体要求 背景处理 光线与色彩 负向提示词 小结 常用工具 另外几个相关参数 迭代步数 宽度与高度 提示词引导系数 图片数量 背景…

MongoDB教程(十三):MongoDB覆盖索引

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言什么是覆盖…

开放式牙耳机选哪种?2024五大新晋爆卖机型精选!

开放式蓝牙耳机不会因为耳机与耳朵的贴合度不够而影响音质。此外&#xff0c;开放式蓝牙耳机的外形设计更加时尚&#xff0c;更加符合现代人的审美需求。开放式蓝牙耳机的出现不仅解决了传统入耳式蓝牙耳机佩戴不适的问题&#xff0c;还具有更加舒适、健康、自然、时尚等多重优…

小白可用超稳定内网穿透工具——natapp全方位使用教程(合法合规)

本篇博客仅供学习参考使用&#xff01;&#xff01;&#xff01; 2021年11月14日&#xff0c;国家网信办发布《网络数据安全管理条例(征求意见稿)》&#xff0c;《条例》第41条第2款规定&#xff0c;任何个人和组织不得提供用于穿透、绕过数据跨境安全网关的程序、工具、线路等…

实验07 接口测试postman

目录 知识点 1 接口测试概念 1.1为什么要做接口测试 1.2接口测试的优点 1.3接口测试概念 1.4接口测试原理和目的 2 接口测试内容 2.1测什么 2.1.1单一接口 2.1.2组合接口 2.1.3结构检查 2.1.4调用方式 2.1.5参数格式校验 2.1.6返回结果 2.2四大块 2.2.1功能逻辑…

降低物联网开发门槛的TuyaOS操作系统重磅更新:AI赋能设备升级,配网速度10倍提升,改变传统开发方式

作为降低智能解决方案开发门槛的 TuyaOS 操作系统&#xff0c;此次又迎来了重大更新&#xff08;点击查看 TuyaOS 完整介绍&#xff09;&#xff01; 本次 TuyaOS 3.10.0 版本发布了超丰富的开发框架&#xff0c;覆盖多种协议连接和平台&#xff0c;可供开发者更快速便捷地接入…

直播领夹式麦克风哪个品牌好?直播麦克风十大排行榜推荐

​在这个充满活力与创意的时代&#xff0c;无线领夹麦克风成为了我们捕捉声音的得力助手。无论是在熙熙攘攘的美食街探店&#xff0c;还是在安静的书房进行录制&#xff0c;还是在嘈杂的户外采访&#xff0c;无线领夹麦克风都能出色地完成任务。很多朋友都曾为麦克风的选择而烦…

数据字典的解释

一、没有数据字典的时候&#xff0c;一般通过备注来标明&#xff0c;数据项不同数值所代表的不同含义。 如下图所示&#xff0c;但这样不够灵活。 二、引入数据字典的形式 数据字典由两张表组成&#xff0c;分别是字典类型表和字典数据表。 字典类型表中的字段都是存在多个值…

【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油&#xff01;时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

部分功能的实现和算法

目录 1.雪花算法 2.MD5加密 3.小眼睛显示密码 4.发送验证码 5.倒计时 1.雪花算法 SnowFlake 中文意思为雪花&#xff0c;故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本 雪花算法的原理就是生成一个的 64 位比特…

探索XEX数字资产交易的优势与操作指南

随着数字资产市场的快速发展&#xff0c;越来越多的投资者开始关注并参与其中。XEX交易所作为一个新兴的数字资产交易平台&#xff0c;以其用户友好的界面和高效的交易服务&#xff0c;迅速吸引了大量用户。本文将介绍XEX数字资产交易的主要特点和优势&#xff0c;帮助新手更好…

昇思25天学习打卡营第18天|munger85

DCGAN生成漫画头像 首先肯定是下载训练数据&#xff0c;而这些训练数据就是一些卡通头像。后来我们会看到这个具体的头像 就像其他的数据集目录一样&#xff0c;它是由一些目录和这个目录下面的文件组成的数据集。 有相当多的图片。所以可以训练出来比较好的效果。 图片的处理…