数据结构DAY3--栈与队列

栈:

是一种只能从一端操作的表,规则为先进后出。

主要操作步骤为:1.建立相关结构体 2.建立栈 3.增加栈 4.获得栈顶值 5.删除 6.修改 7.销毁 

1.建立两个结构体

一个为链栈,一个为结点,链栈包括栈头(指针)和栈个数,结点包括数据和指向下一个栈的指针

typedef struct node
{int data;struct node *pnext;
}STACK_NODE;typedef struct stack
{STACK_NODE *ptop;int clen;
}STACK_LIST;
2.建立栈

首先要建立一个链栈,首先用链栈结构体定义一个大小为结构体大小的指针,使其栈顶指向空,栈个数初始化为0,然后将其返回。

STACK_LIST *create_link_stack()
{STACK_LIST *pstack = malloc(sizeof(STACK_LIST));if (NULL == pstack){perror("fail malloc");return NULL;}pstack->ptop = NULL;pstack->clen = 0;return pstack;
}
3.增加栈

首先建立结点,用结点结构体定义一个大小为结构体大小的指针,使其数据域为输入数据,结点的后驱指针指向空,然后将其返回,返回后,使结点的后驱等于栈链的栈顶,栈链的栈顶等于结点,栈个数加1,一个栈就建立好了。

STACK_NODE *create_node(DATA_TYPE data)
{STACK_NODE *pnode =  malloc(sizeof(STACK_NODE));if (NULL == pnode){perror("fail malloc");return NULL;}pnode->data = data;pnode->pnext = NULL;return pnode;
}	int push_stack(STACK_LIST *pstack, STACK_NODE *pnode)
{if (NULL == pstack || NULL == pnode){return -1;}pnode->pnext = pstack->ptop;pstack->ptop = pnode;pstack->clen++;return 0;
}
4.获得栈顶值:

输入一个指针,以便能从函数中获取数据,使该指针等于链栈的顶的数据域的值即可。

5.删除(出栈):

其与直接删除不同,其在删除时还会获得删除处的值,所以也要输入一个指针获得数据,首先用结点结构体定义一个结点,使该结点等于栈顶,再使栈顶等于结点的后驱(相当于删除了一个),此时再使指针等于此时栈顶的数据域的值。最后使用free释放结点, 栈个数减一。

int pop_stack(STACK_LIST *pstack, DATA_TYPE *pdata)
{	if (NULL == pstack){return -1;}if (is_empty_stack(pstack)){return -1;}STACK_NODE *pnode = pstack->ptop;pstack->ptop = pnode->pnext;if (pdata != NULL){*pdata = pnode->data;}free(pnode);pstack->clen--;return 0;
}
6.销毁 :

循环出栈,直到链栈头指向空,出栈时不用获取数据。最后再释放链栈空间

void clear_stack(STACK_LIST *pstack)
{while (!is_empty_stack(pstack)){pop_stack(pstack, NULL);}free(pstack);
}

队列:

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。

主要操作步骤为:初始化队列,入队,出队,遍历,销毁队列

初始化队列:

同链表与栈,首先建立两个结构体,一个为队列表头,包括指向对头的指针和指向对尾的指针,以及队列结点的个数。另一个为队列结点,包括数据域以及指向下个结点的指针。

typedef struct node
{DATA_TYPE data;struct node *pnext;
}QUE_NODE;typedef struct que
{QUE_NODE *pfront;QUE_NODE *prear;int clen;
}QUE_LIST;
入队操作:

首先创建队列表头,用表头结构体定义一个大小为结构体大小的指针,使队头队尾都指向空,队列结点个数尾为0,然后将其返回:

QUE_LIST *create_link_queue()
{QUE_LIST *pque = malloc(sizeof(QUE_LIST));if (NULL == pque){perror("fail malloc");return NULL;}pque->pfront = NULL;pque->prear = NULL;pque->clen = 0;return pque;
}

其次创建结点,用结点结构体定义一个大小为结构体大小的指针,后驱结点指向空,数据域为输入的数据,并将其返回。

QUE_NODE *create_node(DATA_TYPE data)
{QUE_NODE *pnode = malloc(sizeof(QUE_NODE));if (NULL == pnode){perror("fail malloc");return NULL;}pnode->data = data;pnode->pnext = NULL;return pnode;
}

接着将结点与表头结合:如果是空队列,则使表头的后驱指针与前驱指针都指向结点;如果不是空队列则使表头的后驱结点的指向下一个的指针指向结点,表头的后驱结点也指向结点,最后使队列结点个数加1即可。

int push_queue(QUE_LIST *pque, QUE_NODE *pnode)
{if (is_empty_queue(pque)){pque->prear = pnode;pque->pfront = pnode;}else{pque->prear->pnext = pnode;pque->prear = pnode;}pque->clen++;return 0;
}
出队操作:

用结点结构体定义一个指针,其等于队列表头的头,队列表头的头等于指针的后驱结点,如果队列表头的头为空,则使其尾也为空,如果数据域不为空,则使传入的数据指针的值为数据域的值。最后释放结点,并使结点个数减一。

int pop_queue(QUE_LIST *pque, DATA_TYPE *pdata)
{if (is_empty_queue(pque)){return -1;}QUE_NODE *pnode = pque->pfront;pque->pfront = pnode->pnext;if (NULL == pque->pfront){pque->prear = NULL;}if (pdata != NULL){*pdata = pnode->data;}free(pnode);pque->clen--;return 0;
}
遍历:

用结点结构体定义一个指针 ,其值等于队列链表的前驱,只要该结点不为空,就打印其数据域的数据,并使该结点的值为该结点的后驱结点。

销毁:

步骤与栈类似:

void destroy_queue(QUE_LIST *pque)
{while (!is_empty_queue(pque)){pop_queue(pque, NULL);}free(pque);
}

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

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

相关文章

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络…

java数据结构与算法刷题-----LeetCode367. 有效的完全平方数

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 自实现Math.sqrt()函数:牛顿迭代法 自实现Math.sqrt(…

Redis单线程 VS 多线程

一、Redis 为什么选择单线程? 这种说法其实并不严谨,为什么这么说呢? Redis的版本有很多 3.x、4.x、6.x,版本不同架构也不同的,不限定版本问是否单线程也是不太严谨。 版本3.x,最早版本,也就…

项目架构MVC,DDD学习

写在前面 本文一起看下项目架构DDD,MVC相关的内容。 1:MVC 不管我们做什么项目,自己想想其实只是做了三件事,如下: 其实,这三件事完全在一个类中做完也可以可以正常把项目完成的,就像下面这…

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源: 命令合并: 分别切换了 brew.git、 homebrew-core.git、 homebrew-…

逆向案例十二——看准网企业信息json格式的信息

网址:【全国公司排行|排名榜单|哪家好】-看准网 打开开发者工具——刷新——网络——XHR——下滑页面加载新的页面——找到数据包 发现参数加密,返回的数据也进行了加密 按关键字在下方搜索 kiv进入第一个js文件 ctrlf打开文件里面的搜索框继续搜kiv找到…

12.手写JavaScript bind方法

一、核心思想 bind相比apply和call引入了闭包的思想,重点是正确找到this和arguments 二、代码实现 /*** 手写bind* param {Function} o 函数* param {Array} ...args1 数组* return 根据具体情况考虑*/ function Fn(a,b,c,d){console.log("this.name:"…

Java 面试宝典:Redis 的线程模型是怎么样的?

大家好,我是大明哥,一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站:https://www.skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 Redis 的线程模型其实是分两块的: Redis 6.0 …

前端开发语言有那些?

前端开发语言有那些? 1、html 超文本标记语言:构建前端网页的基本结构,就象人的骨架一样。 2、css 层叠样式表:控制网页的样式和布局,就象人需要穿各种服式展现不同风采。 3、javascript 简称 JS 动态脚本语言&#x…

阿里面试总结

ThreadLocal 线程变量存放在当前线程变量中,线程上下文中,set将变量添加到threadLocals变量中 Thread类中定义了两个ThreadLocalMap类型变量threadLocals、inheritableThreadLocals用来存储当前操作的ThreadLocal的引用及变量对象,把当前线程…

gcc/g++:预编译阶段嵌入头文件并完成替换

预编译阶段嵌入头文件并完成替换首先需要找到需要包含头文件的位置,然后进行引入。 示例: 1)用户头文件 /*brief design and implements of demo-for-precompile.author wenxuanpeiemail 15873152445163.com(query for any question here) …

括号串(Deque)

题目 import java.util.Deque; import java.util.LinkedList; import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();char[] c sc.nextLine().toCharArray();Deque…

Prompt提示词——常见的Prompt框架

以下是一些常见的Prompt框架,包括它们的原理、功能、使用场景、优缺点以及示例: BROKE框架: 原理:BROKE是一个结合了OKR(Objectives and Key Results)方法论的框架,通过提供背景、角色、目标、关…

柒拾贰- tushare 模拟策略交易 (三)

书接上两回 柒拾- tushare 模拟策略交易 (一) 柒拾壹- tushare 模拟策略交易 (二) 开始 终于我们可以可以来进行模拟了 复杂 的我不会,所以就写个最简单的策略吧: 买入条件 比两年前是上升的比一年前…

前端开发之el-select 设置默认值后选项无法切换

前端开发之el-select 设置默认值后选项无法切换 前言解决方案 前言 在实际使用过程中发现再给el-select设置默认值之后选项无法进行切换了 解决方案 为el-select添加 change“$forceUpdate()” 添加这个即可 <template><el-form-item label"数据类型"&g…

【题目】【信息安全管理与评估】2023年国赛信息安全管理与评估正式赛任务书-模块2

全国职业院校技能大赛高等职业教育组 信息安全管理与评估 任务书 模块二 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 竞赛任务书&#xff0c;赛题&#xff0c;解析&#xff0c;培训服务添加博主wx&#xff1a;liuliu5488233 网络安全事件…

speech to text 库FastASR交叉编译arm target的配置

FastASR是一个比较方便的SPEECH TO TEXT的AI库。开源。下面介绍下其在交叉编译到ARM target时候的交叉编译的cmake配置&#xff1a; cmake_minimum_required(VERSION 3.10)project(FastASR)SET(CMAKE_C_COMPILER "/home/xxx/buildroot/output/platform_name/host/bin/aar…

Flutter第六弹 基础列表ListView

目标&#xff1a; 1&#xff09;Flutter有哪些常用的列表组建 2&#xff09;怎么定制列表项Item&#xff1f; 一、ListView简介 使用标准的 ListView 构造方法非常适合只有少量数据的列表。我们还将使用内置的 ListTile widget 来给我们的条目提供可视化结构。ListView支持…

性能分析--内存知识

内存相关知识 计算机中与CPU进行数据交换的桥梁。内存的速度&#xff0c;比CPU的速度要慢很多。比磁盘速度要快很多。内存中存放数据&#xff0c;一旦断电就会消失。linux系统的 /proc路径下的文件&#xff0c;都是内存文件。内存大小&#xff0c;一般 是GB为单位。 现在都操作…

WebKit是什么?

WebKit是一个开源的浏览器引擎&#xff0c;它用于呈现网页内容在许多现代浏览器中&#xff0c;包括Safari浏览器、iOS内置浏览器、以及一些其他浏览器如Google Chrome的早期版本。以下是一些关于WebKit的重要信息&#xff1a; 起源和发展&#xff1a;WebKit最初是由苹果公司为其…