数据结构栈和队列

系统栈         程序运行中使用的栈,由操作系统维护

栈区:1,保存局部变量

           2,函数的形参的返回值

           3,函数的调用关系         函数中调用函数时会把调用函数的下一条指定的首地址保存在栈区。       (保护现场和恢复现场)。

特点:先进后出,后进先出

数据结构中的栈 

只允许从一端进行数据的插入和删除的线性的存储结构

特点:先进后出,后进先出      FILO

      由自己开辟空间,维护

表尾称为栈顶,表头端称为栈底 。不含元素的空表称为空栈。栈的修改是按后进先出的原则进行的

满栈、空栈:栈顶所在位置是否存有元素

增栈:栈顶向内存高地址移动。

减栈:栈顶向内存低地址移动。

顺序栈:指利用顺序存储结构实现的栈(数组)

链式栈:指采用链式存储结构实现的栈

        以链表表头做栈顶

定义节点及栈对象:

typedef int DataType;typedef struct snode
{DataType data;struct snode *pnext;
}SNode_t;typedef struct stack
{SNode_t *ptop;int clen;
}Stack_t;

链式栈的操作

1. 创建栈
2. 入栈
3. 出栈
4. 清空栈
5. 判空
6. 获取栈顶元素
7.销毁栈

Stack_t *create_stack()                 //创建
{Stack_t *pslink = malloc(sizeof(Stack_t));if(pslink == NULL){perror("malloc fail");return NULL;}pslink->ptop = NULL;pslink->clen = 0;return pslink;
}
int is_empty_stack(Stack_t *pslink)     //判空
{return pslink->ptop == NULL;
}int push_stack(Stack_t *pslink,DataType data)  //入栈
{SNode_t *pnode = malloc(sizeof(SNode_t));if(pnode == NULL){perror("malloc fail");return -1;}pnode->data = data;pnode->pnext = pslink->ptop;pslink->ptop = pnode;pslink->clen++;return 0;
}void print_stack(Stack_t *pslink)         // 遍历
{SNode_t *p = pslink->ptop;while(p != NULL){printf("%d  ",p->data);p = p->pnext;}printf("\n");
}int pop_stack(Stack_t *pslink,DataType *data)   //出栈
{if(!is_empty_stack(pslink)){SNode_t *p = pslink->ptop;pslink->ptop = p->pnext;if(data != NULL){*data = p->data;}free(p);}pslink->clen--;return 1;
}int get_stack_top(Stack_t *pslink,DataType *data)   //获取栈顶元素
{if(!is_empty_stack(pslink)){if(pslink != NULL){*data = pslink->ptop->data;return 1;}}return 0;
}
void clear_stack(Stack_t *pslink)      //清空栈
{while(!is_empty_stack(pslink)){pop_stack(pslink,NULL);}
}
void destroy_stack(Stack_t *pslink)    //销毁栈
{clear_stack(pslink);free(pslink);
}

队列:先进先出,后进后出    FIFO

 允许从一端插入数据, 另一端删除数据的线性存储结构

允许插入的一端称为队尾,允许删除的一端则称为队头

顺序队列,存在假溢出,可以使用循环队列解决

链式队列:链队是指采用链式存储结构实现的队列。 通常链队用单链表来表
示。 选择链表表头做对头,表尾做队尾。

注意链表对象中pfront指向对头,prear指向队尾

定义节点及链表对象

typedef int QDataType;typedef struct qnode
{QDataType data;struct qnode *pnext;
}Queue_Node_t;typedef struct queue
{Queue_Node_t *pfront;Queue_Node_t *prear;int clen;pthread_mutex_t mutex;
}Queue_t;

l链式队列的操作:

1. 创建队列
2. 入队
3. 出队
4. 判空
5. 清空
6. 获取对头元素
7. 销毁

Queue_t *create_queue()     //创建队列
{Queue_t *pqueue = malloc(sizeof(Queue_t));if(pqueue == NULL){perror("malloc fail");return NULL;}pqueue->pfront = NULL;pqueue->prear = NULL;pqueue->clen = 0;pthread_mutex_init(&(pqueue->mutex),NULL);return pqueue;
}int is_empty_queue(Queue_t *pqueue)    //判空
{return pqueue->pfront == NULL;
}int push_queue(Queue_t *pqueue,QDataType data)     //入队
{Queue_Node_t *pnode = malloc(sizeof(Queue_Node_t));if(pnode == NULL){perror("malloc fail");return -1;}pnode->data = data;pnode->pnext = NULL;if(!is_empty_queue(pqueue)){pqueue->prear->pnext = pnode;pqueue->prear = pnode;}else{pqueue->prear = pnode;pqueue->pfront = pnode;}pqueue->clen++;return 1;
}
int pop_queue(Queue_t *pqueue,QDataType *data)      //出队
{if(!is_empty_queue(pqueue)){Queue_Node_t *p = pqueue->pfront;pqueue->pfront = p->pnext;if(data != NULL){*data = p->data;}if(p->pnext == NULL){pqueue->prear = NULL;}free(p);}pqueue->clen--;return 1;
}void print_queue(Queue_t *pqueue)     //遍历
{Queue_Node_t *p = pqueue->pfront;while(p != NULL){printf("%d ",p->data);p = p->pnext;}printf("\n");
}int get_queue_front(Queue_t *pqueue,QDataType *data)    //获取队头元素
{if(!is_empty_queue(pqueue)){if(data != NULL){*data = pqueue->pfront->data;}}return 1;
}void clear_queue(Queue_t *pqueue)    //清空
{while(!is_empty_queue(pqueue)){pop_queue(pqueue,NULL);}
}void destroy_queue(Queue_t *pqueue)  //销毁
{clear_queue(pqueue);free(pqueue);
}

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

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

相关文章

Steam游戏截图方法

Steam游戏截图方法 截图快捷键 Steam游戏自带截图功能,在游戏中无需复杂的快捷键,仅需按下F12快捷键便可立即截图,官方说明如下。下文介绍使用方法。 查看截图 退出游戏后,在Steam界面点击查看 - 截图,即可查看截…

JAVA—反射

学习Java中关于反射的知识,以理解框架 目录 1.认识反射 2.获取类 3.获取构造器 4.获取成员变量​编辑 5.获取成员方法 6.作用 应用场景 1.认识反射 反射 加载类 并允许以编程的方式解刨类中的各种成分(成员变量 方法 构造器) 学习反射…

【Hadoop|HDFS篇】HDFS的读写流程

1. HDFS的写流程 1.1 剖析文件的写入 副本存储节点的选择问题: 第一个副本在Client所在的节点上,如果客户端在集群外,随机选一个。第二个副本在另一个机架的随机一个节点上。第三个副本在第二个副本所在的机架的随机节点上。 2. HDFS的写流…

机器学习和物联网驱动技术在加工过程中监测工具磨损:一项全面的综述

这篇论文的标题是《Machine-Learning and Internet-of-Things-Driven Techniques for Monitoring Tool Wear in Machining Process: A Comprehensive Review》,由 Sudhan Kasiviswanathan、Sakthivel Gnanasekaran、Mohanraj Thangamuthu 和 Jegadeeshwaran Rakkiya…

超越传统:Reflection 70B如何革新AI语言处理

Reflection 70B:AI语言模型的新里程碑🚀 AI领域迎来了革命性的变革,HyperWrite公司推出的开源AI大模型Reflection 70B,以其卓越的性能在多个基准测试中超越了GPT-4o和Llama 3.1。这款基于Meta的Llama 3.1 70B Instruct构建的模型…

为何iPhone 16系列的发布对苹果至关重要?

即将发布的iPhone 16系列对苹果来说将是至关重要的时刻,特别是在快速发展的AI智能手机市场背景下。随着Android制造商在集成先进AI功能方面领先一步,苹果正处于一个关键的转折点——赶上竞争对手不仅仅是选择,而是必须完成的任务。 AI竞赛&am…

上交2024最新-《动手学大模型》实战教程及ppt分享!

本课介绍 今天分享一个上海交大的免费的大模型课程,有相关教程文档和Slides,目前是2.2K星标,还是挺火的! 《动手学大模型》系列编程实践教程,由上海交通大学2024年春季《人工智能安全技术》课程(NIS3353&…

传统CV算法——基于harris检测算法实现角点检测

角点 角点是图像中的一个特征点,指的是两条边缘交叉的点,这样的点在图像中通常表示一个显著的几角。在计算机视觉和图像处理中,角点是重要的特征,因为它们通常是图像中信息丰富的区域,可以用于图像分析、对象识别、3D…

如何在极狐GitLab中添加 SSH Key?

本文分享如何生成 SSH Key 并添加到极狐GitLab 中,然后用 SSH Key 进行代码拉取。 极狐GitLab 是 GitLab 在中国的发行版,可以私有化部署,对中文的支持非常友好,是专为中国程序员和企业推出的企业级一体化 DevOps 平台&#xff0…

43. 1 ~ n 整数中 1 出现的次数【难】

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9843.%201%EF%BD%9En%E6%95%B4%E6%95%B0%E4%B8%AD1%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0/README.md 面试题 43. 1 ~ n 整数中 1 …

C#游戏服务器开发框架设计与架构详解

我一直在思考一个问题,什么样的服务端框架最好用,最适合? 经过这些年的项目经验,其实最好用,最适合的游戏服务端框架就是自己结合公司项目需求,团队特点与技术能力,自己整合的游戏框架是最好用的。 很多新手会担心自己整合的框架…

JS生成二维码QRCode代码

JavaScript是一种广泛使用的前端编程语言,它不仅用于网页交互,还可以实现许多实用功能,如生成二维码。本篇文章将深入探讨如何使用JavaScript生成二维码,以及如何确保这种生成的二维码在各种浏览器和手机端都能正常工作&#xff0…

找不同-第15届蓝桥省赛Scratch初级组真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第183讲。 如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,…

GAMES101(0~1作业)

搭建虚拟机环境 安装Oracle VM VirtualBox虚拟机,安装虚拟硬盘,配置Linux Ubuntu-64 bit系统,启动虚拟机,发生冲突错误: 将Vmware虚拟设备取消挂起状态,关机确保 Hyper-V 完全关闭:bcdedit /se…

【Python · Pytorch】配置cuda环境 cuDNN库

【Python Pytorch】配置cuda环境 & cuDNN库 1. 查找对应版本1.1 查看Pytorch GPU目前支持版本1.1 查看Nvidia驱动版本1.2 查看支持cuda版本1.3 查看支持cuDNN版本1.3.1 cuDNN 9.0.0及以上版本1.3.2 cuDNN 9.0.0以下版本 1.4 安装版本确定 2. 安装cuda环境2.1 cuda简介2.1.…

Leetcode Hot 100刷题记录 -Day10(合并区间)

合并区间 问题描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti,endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入&…

【计算机网络】浏览器输入访问某网址时,后台流程是什么

在访问网址时,后台的具体流程可以因不同的网站、服务器和应用架构而异。 实际过程中可能还涉及更多的细节和步骤,如缓存处理、重定向、负载均衡等。 此外,不同的网站和应用架构可能会有不同的实现方式和优化策略。 部分特定网站或应用&#x…

【C++】stack、queue、priority_queue的模拟实现

目录 一、stack 🌟stack的简单介绍 🌟stack的基本使用 🌟stack的模拟实现 🌟stack模拟实现的完整代码 🌟容器适配器 二、queue 🌟queue的简单介绍 🌟queue的基本使用 🌟q…

828华为云征文|Flexus云服务器X实例快速部署在线测评平台,适用各种信息学教学

文章目录 如何选配Flexus云服务器X实例服务器HydroOJHOJ 服务器资源的选取基础配置实例规格镜像、存储、网络弹性公网IP云服务器名称 部署HydroOJ1.设置安全组、开放端口2.部署HydroOJ回到控制中心,远程登录 部署HOJ安装docker# 安装docker-compose部署HOJ 本篇幅为…

Git 使用指南 --- 版本管理

序言 Git 是一个开源的 分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。对一个程序员来说,掌握 Git 的使用是必要的。  在这个系列中,将详细的介绍 Git 的使用和原理,话不多说,让我们开始吧。…