数据结构 04

4. 栈

4.2. 链式栈

4.2.1. 特性

逻辑结构:线性结构
存储结构:链式存储结构
操作:创建,入栈,出栈,清空,获取

4.2.2. 代码实现

头文件 LinkStack.h

#ifndef __LINKSTACK_H__
#define __LINKSTACK_H__
typedef int datatype;
typedef struct linkstack
{datatype data;struct linkstack *next;
} linkstack_t;
//1.创建一个空的栈
void createEmptyLinkStack(linkstack_t **ptop);
//2.入栈,ptop是传入的栈针的地址,data是入栈的数据
int pushLinkStack(linkstack_t **ptop, datatype data);
//3.判断栈是否为空
int isEmptyLinkStack(linkstack_t *top);
//4.出栈
datatype popLinkStack(linkstack_t **ptop);
//5.清空栈
void clearLinkStack(linkstack_t **ptop);
//6.求栈的长度
int lengthLinkStack(linkstack_t *top);
//7.获取栈顶数据,不是出栈,不需要移动main函数中的top,所以用一级指针
datatype getTopLinkStack(linkstack_t *top);
#endif

1.创建一个空的栈

void createEmptyLinkStack(linkstack_t **ptop)
{*ptop = NULL;
}
  1. 入栈
int pushLinkStack(linkstack_t **ptop, datatype data)
{// 定义一个指针pnew,指向新节点linkstack_t *pnew = (linkstack_t *)malloc(sizeof(linkstack_t));if(pnew == NULL){printf("New Node Creation Failed!!\n");return -1;}// 初始化pnew->data = data;pnew->next = *ptop;	// 新节点的指针域,指向旧节点的地址// 栈针移动到最新的节点*ptop = pnew;
}
  1. 判断栈是否为空
int isEmptyLinkStack(linkstack_t *top)
{// 栈针指向NULL时,栈为空return top == NULL;
}
  1. 出栈
datatype popLinkStack(linkstack_t **ptop)
{// 容错判断if (isEmptyLinkStack){printf("Stack is empty!!\n");return NULL;}// 定义指针pdel,指向出栈节点linkstack_t* pdel = NULL;// 定义中间变量,暂存出栈数据datatype data = 0;// pdel指向出栈节点pdel = *ptop;// data暂存出栈数据data = pdel->data;// 栈针移动,释放出栈节点*ptop = (*ptop)->next;free(pdel);pdel = NULL;// 返回出栈数据return data;
}
  1. 清空栈
void clearLinkStack(linkstack_t **ptop)
{while(!isEmptyLinkStack(*ptop)){popLinkStack(ptop);}
}
  1. 求栈的长度
int lengthLinkStack(linkstack_t *top)
{// 定义一个变量,作为长度的计数int len = 0;// 链式栈长度的计算实际上是无头单向链表的遍历问题while(top =  NULL){len ++;	// 累计计数top = top->next;	// 栈针移动}
}
  1. 获取栈顶数据
datatype getTopLinkStack(linkstack_t *top)
{// 容错判断if (!isEmptyLinkStack(top)){printf("Stack is empty\n");return -1;}// 返回栈顶数据return top->data;
}

5. 队列

5.1. 特性

  1. 一端只能输入,称为队尾;另一端只能输出,称为队头
  2. 先进先出:FIFO
  3. 存在假溢出现象:
    1)当数据存满后,有数据从队头出列后,应该可以存入新的数据,但是因为数据在队列里面不移动,所以队尾不存在空位,新数据无法入列,但是队列未满,如下图
    假溢出现象
    2)解决方法:顺序队列

5.2. 顺序队列(循环队列)

循环队列
需要实现头和尾都可以走完最后一位之后再走回来,比如4->5->0->1。
方法一:

if(i==N)i = 0;
elsei++;

方法二:

i = (i+1)%N;

5.2.1. 代码实现

头文件 sequeue.h

#ifndef __SEQUEUE_H__
#define __SEQUEUE_H__
#define N 6
typedef int datatype;
typedef struct
{datatype data[N];//循环队列的数组int rear;//存数据端 rear 后面int front;//取数据端 front 前面
}sequeue_t;// 1. 创建一个空的队列
sequeue_t *createEmptySequeue();
// 2. 判断队列是否为满
int isFullSequeue(sequeue_t *p);
// 3. 入列 data代表入列的数据
int inSequeue(sequeue_t *p,datatype data);
// 4. 判断队列是否为空
int isEmptySequeue(sequeue_t *p);
// 5. 出列 
datatype outSequeue(sequeue_t *p);
// 6. 求队列的长度
int lengthSequeue(sequeue_t *p);
// 7. 清空队列函数
void clearSequeue(sequeue_t *p);
#endif
  1. 创建一个空队列
sequeue_t *createEmptySequeue()
{// 申请空间存放队列结构sequeue_t *p = (sequeue_t *)malloc(sizeof(sequeue_t));if(p == NULL){printf("Space opening failure !!\n");return NULL;}// 初始化p->rear = 0;p->front = 0;return p;
}
  1. 判断是否为满
int isFullSequeue(sequeue_t *p)
{// 循环队列的判满公式return p->front == (p->rear + 1) % N;
}
  1. 入列
int inSequeue(sequeue_t *p, datatype data)
{// 容错判断if( isFullSequeue(p) ){printf("Space is Full !!\n");return -1;}// 入列p->data[p->rear] = data;// 队尾向后移动一个数据单位p->rear = (p->rear + 1) % N;return 0;
}
  1. 判断是否为空
int isEmptySequeue(sequeue_t *p)
{// 空返回1,非空返回0return p->rear == p->front;
}
  1. 出列
datatype outSequeue(sequeue_t *p)
{// 容错判断if ( isEmptySequeue(p) ){printf("Space is empty !!\n");return -1;}// 出列// 1)定义一个变量,暂存出列数据datatype data = p->data[p->front];// 2)队头移动p->front = (p->front + 1) % N;return data;
}
  1. 求队列的长度
int lengthSequeue(sequeue_t *p)
{// 队尾可以大于队头,也可以小于队头// rear >= front, rear - front 是长度// rear < front, rear + N -front ,这种情况相当于,队尾套了队头一圈// 两种情况综合之后得到公式 ( rear + N - front ) % Nreturn ( p->rear - p->front + N ) % N;
}

+N 之后 %N 对结果来说,相当于没操作

  1. 清空队列函数
void clearSequeue(sequeue_t *p)
{// p->front = p->rear;	// 不返回数据while(!isEmptySequeue(p))outSequeue(p);	// 可以返回出列数据, 看需求
}

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

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

相关文章

【云安全】云原生-K8S(四)安全问题分析

Kubernetes&#xff08;K8S&#xff09;因其强大的容器编排能力成为了云计算和微服务架构的首选&#xff0c;但同时也带来了复杂的安全挑战。本文将概述K8S的主要安全问题&#xff0c;帮助安全工程师理解潜在威胁&#xff0c;并采取相应的防护措施。 K8S 攻击面概览 下面两张…

【Unity新手】Text不显示字的问题解决办法

很多同学在unity里导入了一个Text发现字没有显示出来为什么呢&#xff1f; 首先在网络上下载一个.ttf或者.otf字体文件&#xff0c;导入资源&#xff0c;比如说我下载了黑体.otf 然后导入unity&#xff0c;右键字体TextMesgPro-FontAsset 然后字体设置里添加上就可以了

基于Flask的影视剧热度数据可视化分析系统的设计与实现

【FLask】基于Flask的影视剧热度数据可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网技术的飞速发展&#xff0c;影视剧行业的数据量呈爆炸性增长&#x…

React 低代码项目:组件设计

React 低代码项目&#xff1a;组件设计 Date: February 6, 2025 React表单组件 **目标&#xff1a;**使用 Ant Design 表单组件&#xff0c;开发登录、注册、搜索功能 内容&#xff1a; 使用 React 表单组件、受控组件使用 Ant Design 表单组件使用 表单组件的校验和错误提…

vue-plugin-hiprint (vue2

页面效果 <template><div><div class="d-flex flex-column mt5"><div class="d-flex flex-row " style="margin-bottom: 10px;justify-content: center;"><!-- 纸张大小 A3、A4 等 --><div class="paper…

C++17 中的 std::reduce:详细教程

文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法&#xff0c;用于对范围内的元素进行归并操作。它…

kafka介绍,kafka集群环境搭建,kafka命令测试,C++实现kafka客户端

目录 kafka介绍kafka集群环境搭建zookeeper安装与配置kafka安装与配置 kafka命令测试C实现kafka客户端librdkafka库编译新版本cmake编译cppkafka库编译C实现kafka生产者和消费者客户端 kafka介绍 定义与概述 Apache Kafka 是一个开源的分布式流处理平台&#xff0c;最初由 Lin…

华为云+硅基流动使用Chatbox接入DeepSeek-R1满血版671B

华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 硅基流动 1.1 注册登录 1.2 实名认证 1.3 创建API密钥 1.4 客户端工具 OllamaChatboxCherry StudioAnythingLLM 资源包下载&#xff1a; AI聊天本地客户端 接入Chatbox客户端 点击设置 选择SiliconFloW API 粘贴1.3创…

阿里云百炼平台对接DeepSeek官方文档

目录 1、支持的模型 2、快速开始 2.1、OpenAI兼容 2.1.1、python示例代码 返回结果 2.1.2、Node.js示例代码 返回结果 2.1.3、HTTP示例代码 返回结果 2.2、DashScope 2.2.1、python示例代码 返回结果 2.2.2、java示例代码 返回结果 2.2.3、HTTP代码示例 返回结…

【深度强化学习】策略梯度算法:REINFORCE

策略梯度 强化学习算法进阶 Q-learning、DQN 及 DQN 改进算法都是基于价值&#xff08;value-based&#xff09;的方法&#xff0c;其中 Q-learning 是处理有限状态的算法&#xff0c;而 DQN 可以用来解决连续状态的问题。在强化学习中&#xff0c;除了基于值函数的方法&#…

DeepSeek接口联调(postman版)

第一步&#xff1a;获取API key 获取APIkeys链接https://platform.deepseek.com/api_keys 点击创建 API key 即可免费生成一个key值&#xff0c;别忘记保存。 第二步&#xff1a;找到deepseek官方接口文档 文档地址&#xff1a;https://api-docs.deepseek.com/zh-cn/ 第三步…

Sublime Text 3 中的 Pylinter 配置

在 Sublime Text 3 中配置 Pylinter&#xff08;如 pylint&#xff09;来进行 Python 代码静态分析&#xff0c;可以帮助你提升代码质量、检测潜在的错误、强制遵守编码标准等。为了在 Sublime Text 3 中配置 pylint&#xff0c;你需要确保 pylint 已安装&#xff0c;并设置好相…

LC-搜索二维矩阵II、相交链表、反转链表、回文链表、环形链表、环形链表ll

搜索二维矩阵II 方法&#xff1a;从右上角开始搜索 我们可以从矩阵的右上角开始进行搜索。如果当前元素 matrix[i][j] 等于 target&#xff0c;我们直接返回 true。如果 matrix[i][j] 大于 target&#xff0c;说明 target 只能出现在左边的列&#xff0c;所以我们将列指针向左…

支持列表拖拽嵌套,AI流式输出的多模态文档编辑器flowmix/docx: 全面升级

hi, 大家好, 我是徐小夕. 马上又到周五了, 最近也收到很多用户对 flowmix/docx 多模态文档编辑器的反馈&#xff0c;我们也做了一波新功能的升级&#xff0c;今天就和大家分享一下 flowmix/docx 多模态文档编辑器的最新更新. 演示地址: https://flowmix.turntip.cn/docx 以下是…

服务器中部署大模型DeepSeek-R1 | 本地部署DeepSeek-R1大模型 | deepseek-r1部署详细教程

0. 部署前的准备 首先我们需要足够算力的机器&#xff0c;这里我在vultr中租了有一张A16显卡一共16GB显存的服务器作为演示。部署的模型参数为14b的。如果需要部署满血版本671b的&#xff0c;需要更大的算力支持&#xff0c;这里由于是个人资金有限&#xff0c;就演示14b的部署…

Linux软件编程(1)

1.总述&#xff1a; 2.标准io与文件io 标准C库提供的一套文件操作接口&#xff1b; Linux内核为Linux操作系统提供的一套文件操作接口。 3.函数接口&#xff1a; 注意 &#xff1a;什么是文件流&#xff1f; 数据从文件流入和流出体现的字节流。 注意&#xff1a;od -c 文件…

网页五子棋——通用模块

目录 项目创建 通用功能模块 错误码 自定义异常类 CommonResult jackson 加密工具 项目创建 使用 idea 创建 SpringBoot 项目&#xff0c;并引入相关依赖&#xff1a; 配置 MyBatis&#xff1a; 编辑 application.yml&#xff1a; spring:datasource: # 数据库连接配…

【工具】在idea运行go后端

场景&#xff1a;从gitee仓库下载一个go语言前后端分离项目&#xff0c;想跑通前后端 ---------------------------------------------------------------------------------------------------------------------- 后端 1.下载插件 在idea的setting里面输入go&#xff0c;…

通达信如何导出以往的分时数据

1当天分时数据的导出 以梦网科技为例&#xff0c;在分笔交易上面右键&#xff0c;选择“放大”&#xff0c;放大后选择“选项”&#xff0c;选择“数据导出”&#xff0c;弹出界面中修改路径与文件名即可。 2以往数据的导出 以梦网科技为例&#xff0c;今天是2025年2月14号…

【面试题系列】Java 多线程面试题深度解析

本文涉及Java 多线程面试题&#xff0c;从基础到高级&#xff0c;希望对你有所帮助&#xff01; 一、基础概念类 1. 请简述 Java 中线程的几种状态及其转换条件 题目分析&#xff1a;这是多线程基础中的基础&#xff0c;考查对线程生命周期的理解&#xff0c;在多线程编程中&…