栈和队列实现的思路和代码

news2025/7/11 9:32:44

栈和队列

  • 第一节----栈
    • 什么是栈
    • 实现栈的基本思路
    • 各个接口函数的实现
      • 初始化栈
      • 销毁栈
      • 压栈
      • 出栈
      • 返回栈顶元素
      • 栈的判空
      • 栈的大小
  • 第二节----队列
    • 什么是队列
    • 实现队列的基本思路
    • 各个接口函数的实现
      • 队列的初始化
      • 队列的销毁
      • 队列的插入
      • 队列的删除
      • 返回队头元素和队尾元素
      • 队列的判空
      • 队列的大小
  • 总结

源代码挂在最后的总结处
语言还是C

第一节----栈

什么是栈

接下来我们要学习的两个数据结和前面的链表相比要简单很多了,我们主要讨论一下他们的主要性质和实现思路。

栈的定义:
栈是限定仅在一端进行插入和删除的线性表
注意两个点,仅在一端和线性表

首先我们知道栈也是一种线性表,回想一下我们之前学过的顺序表和链表,这两位也是线性表,线性表无非就两种存储结构,顺序的和链式的,根据各自的优缺点,在前面的顺序表我们使用的顺序存储结构,链表使用的是链式的存储结构。那么我们来讨论一下栈使用什么存储结构比较好?

采用哪种存储结构,要根据栈的插入和删除特点来决定,我们把插入数据的一端叫做栈顶,另一端叫做栈底,并且后进如的数据先出,先进入的数据后出(如图)
在这里插入图片描述
基于这种特性刚好符合我们的数组的特性,如果采用链表的话,时间复杂度相比较于数组会有所提高。

确定了存储结构和栈的先进后出,后进先出的性质之后,下面我们就来开始写代码,实现栈。

实现栈的基本思路

使用顺序的存储结构实现栈和顺序表的实现的代码差不多,所以我们还是除了数组之外给出一个pop变量表示栈中元素的个数,在插入时pop++;,删除时pop–(和前面顺序表的size是一个道理),然后capacity表示容量的大小,当然在容量足的时候也要实现相应的扩容。

对于更具体的插入和删除等等接口函数的实现思路,我们放在各个函数的部分去介绍。

各个接口函数的实现

在这里插入图片描述

初始化栈

初始化的函数接口和我们的顺序表的差不多,我这里先给出了,初始的容量的大小,后续可以再扩容。当然你也可以写成静态(即容量的大小是固定的,容量满了以后不能进行扩容)。
在这里插入图片描述

销毁栈

因为使用的是数组,所以销毁就会容易很多,不必像链表那样一个一个的释放空间。
直接释放整个数组就好了。
在这里插入图片描述

压栈

压栈就是向栈中添加数据元素,有时也叫入栈。
在压栈的时候,我们就要考虑一个问题了,我们前面初始化的时候给的容量大小是4,那么当容量满的时候就要进行扩容的操作,所以我们在正在压榨之前要进行容量的检查,这一点也是和我们前面的顺序表没啥区别的。

这里我在扩容的时候,扩的是原容量大小的二倍。
在这里插入图片描述

出栈

出栈就是从栈中拿出一个数据元素,前面我们已经分析过,栈中数据的存和取都是在一端进行的,那么根据栈的特性,我们直接让pop–即可,这样我们在下一次进行入栈的时候,就能将原数据直接覆盖掉了。
在这里插入图片描述
值得注意的一点是,如果栈已经空了的话(也就是pop为0),这时候就不能再进行出栈的操作了,所以进行断言或者其他的操作也行。

返回栈顶元素

在这里插入图片描述
因为我们的pop表示的是栈中数据的个数,也是下一个数据要插入的位置,所以在返回栈顶数据时要pop-1。
同时栈为空的时候,也是不能进行返回栈顶元素的操作的(都没数据了,还返回个屁)。

栈的判空

栈的判空更简单了。
在这里插入图片描述

栈的大小

根据我们前面的分析,栈的大小也就是pop的大小
在这里插入图片描述
栈的讲解到此就结束啦!

第二节----队列

什么是队列

对列可是说是正好跟栈是反着来的。

队列的定义:
对列是在一端进行插入,另一端进行删除的线性表结构
它和栈的相同点都是线性表,所以我们待会肯定还是要讨论一下队列使用那种存储结构
不同点是,队列的是一端进行插入一端进行删除的线性表,而栈是限定在一端的。

那么我们就先来分析一下,队列使用链式的存储结构好还是使用顺序的存储结构好。

还是一样的,根据它的性质来,我们如果选用顺序表的话,无论是在哪一头进行删除或者插入的操作,都会移动大量的元素,如下图:
在这里插入图片描述
可以看到我们要是想删除1的话,那么后面的数据都需要进行前移一位,根据我们前面所将的链表的知识点来看,正好能避免这一点,所以链表的存储结构更加的适合队列这一种数据结构。

而且单链表就足以满足我们给队列的操作了。

实现队列的基本思路

首先声明一点:我们这里在实现对列的时候,不使用头结点。

在跟之前实现单链表所不同的一点是,我们增加两个指针来指向头和尾,这样我们在后续的接口函数时会方便很多,也会降低时间复杂度。
在这里插入图片描述

各个接口函数的实现

这里是我们接下来要实现的各个接口函数
在这里插入图片描述

队列的初始化

因为我们后面是要通过对head和tail两个指针来控制函数的一系列操作的,所以函数的参数的是Queue*
在这里插入图片描述

队列的销毁

队列的销毁也可以和顺序存储结构的销毁做个对照,顺序存储结构因为是一段连续的存储空间,所以我们可以直接释放掉一整个空间,但是链式的就不行,需要一个一个释放。
在这里插入图片描述

队列的插入

因为我没有使用头结点,所以要考虑一下是否是第一次插入,如果是的话,就将新的结点地址赋值给head和tail即可,如果不是的话,就需要用tail来链接起来。
在这里插入图片描述
size记得++;

队列的删除

删除的时候需要考虑的一种情况是,队列如果为空的话就不能再进行删除了,我这里是用一个函数来判断是否为空,这个函数在后面会实现的,大家也可以换一种方式来判断。

size减减之后,要记得释放掉删除的空间。
在这里插入图片描述

返回队头元素和队尾元素

队头元素和队尾元素:
在这里插入图片描述

因为我们有head和tail指针,所以在返回队头的元素和队尾元素的时候,就很好操作了。
队头元素:
在这里插入图片描述
队尾元素:
在这里插入图片描述

队列的判空

当headtail空的时候即是空,这里将head换成tail或者写成headtail空都是可以的。
在这里插入图片描述

队列的大小

在这里插入图片描述

总结

源代码地址:
队列

相信大家只要学习完前面的顺序表和链表,这两种结构对大家来说就没什么难度,下面给出两道题目,帮助大家加深给栈和队列的理解和认识
用栈实现队列
用队列实现栈

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

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

相关文章

使用DESeq2进行转录组原始count标准化和差异分析

转录组测序完成后,一般我们会获得一个原始 read count表达矩阵,其中行是基因,列是样品。常用的差异分析工具包括limma、edgeR和DESeq2。DESeq2在测序领域使用最为广泛(google scholar引用高达43284次,edgeR为28076次&a…

MYSQL索引查询问题质疑

前言 我们在写mysql查询语句的时候,尤其是经验不足的同学肯定会想要怎么使用索引加快查询,或是我这样写到底会不会命中索引。那么现在我就列举几个常见的索引查询问题进行简单说明一下。(欢迎互怼!) 1.问&#xff1a…

小学生python游戏编程arcade----游戏界面按钮实现事件实现的三种方法

小学生python游戏编程arcade----游戏界面按钮实现事件实现的三种方法前言游戏界面按钮实现事件实现的三种方法1、按钮定义及事件3种方法1.1 按钮定义1.2三种事件引用方法1.2.1 类法1.2.2 事件方法2,自定义方法函数1.2.3 事件方法3,使用装饰器处理onclick事件1.3 效果图1.4 代码…

第十四届蓝桥杯校模拟赛详解+代码(一)

“须知少时凌云志,自许人间第一流” 鄙人11月八号有幸参加学校蓝桥杯校选拔赛,题型为5道填空题,5道编程题,总时间为4小时。奈何能力有限,只完成了5道填空和3道编程大题,现进行自省自纠,分享学习…

艾美捷细胞计数试剂盒-8(CCK-8),一步到位

艾美捷细胞计数试剂盒-8(CCK-8):用于简单准确的细胞增殖和细胞毒性测定的比色试剂盒。 艾美捷细胞计数试剂盒-8(CCK-8)特点: 1、一步到位,不含放射性同位素的即用溶液 2、与[3H]-胸苷掺入试验…

分销商城平台哪个好_分享分销商城开发步骤

微信分销商城平台分为两种: 第一种是入驻到别人的微信分销商城平台里面,帮助分销别人发布的商品从而获得佣金。 第二种情况是自己公司开发的微信分销商城平台,然后招募分销者进行分销公司的产品。 对于大家来讲肯定是自己公司开发的微信分销商…

数据结构与算法_大数据处理_求topK的两种求解方法

这篇笔记记录求大数据topk的两种方法,分别是大小二叉堆法和快速分割法,下面依次详解这两种方法的过程。 1 大/小根堆法 利用大根堆过滤前top k小的数据**;小根堆过滤前top k大的数据**; 下面用大根堆求前k个小元素为例。 思想&…

Python 算法:学习二分法

二分法,一个看似简单,逻辑易懂的算法,但是初次接触可能会有很多坑!主要是边界处理的问题。 下面以一个耳熟能详的案例来展开: 案例描述: 小B从1~100之间(含边界值)任意想一个数字&a…

Spring Security 在登录时如何添加图形验证码

前言 在前面的几篇文章中,登录时都是使用用户名 密码进行登录的,但是在实际项目当中,登录时,还需要输入图形验证码。那如何在 Spring Security 现有的认证体系中,加入自己的认证逻辑呢?这就是本文的内容&…

matplotlib简介

matplotlib是一款用于画图的软件,以下步骤建议在.ipynb中完成。 导包 你需要导入以下包: import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np一个简单案例 matplotlib 在 Figure上绘制图形,每一个Figure会包含…

【附源码】Python计算机毕业设计手游账号交易系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Java注解式开发

目录 1. ssm框架的搭建 1.1 maven项目的创建 1.2 导入所需的包到pom.xml文件中 1.3 导入数据库连接文件、日志文件、redis连接文件 1.3.1 数据库连接文件 1.3.2 日志文件 1.3.3 redis连接文件 1.4 导入spring-mybatis、spring-mvc、spring-base、spring-redis四种集成文…

改变自己 只需要两年

改变自己 只需要两年 https://v.douyin.com/rLDmdQK/ 可以快速浏览上面视频 今天分享的这篇文章是TED上的一篇演讲 希望对下定决心想改变的你一些帮助。 用两年时间证明你可以 两年时间不算多长,但与此同时,很多事情都能在两年内完成,你…

WinHex(三)

目录 一、新建简单卷 二、MBR作用与结构 一、新建简单卷 1.右键点击刚刚新建的虚拟磁盘,选择新建简单卷。我新建了两个一个是NTFS,一个是FAT32 2.我们在刚刚新建的虚拟磁盘中放入一张图片,打开WinHex,点击“打开磁盘”选项,打…

[野火]STM32 F103 HAL库开发实战指南笔记之简单外设总结

1、GPIO编程总结 使能 GPIO 端口时钟;初始化 GPIO 目标引脚为推挽输出模式;编写简单测试程序,控制 GPIO 引脚输出高、低电平。 这部分宏控制 LED 亮灭的操作是直接向 BSRR 寄存器写入控制指令来实现的,对 BSRR 低 16 位 写 1 输出…

大学生静态HTML网页源码 我的校园网页设计成品 学校班级网页制作模板 web课程设计 dreamweaver网页作业

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

从0实现线性回归

编码题: 按要求完成下面的内容 1请用python完成从0实现线性回归,尝试使用不同的训练参数(学习率,迭代次数), 以及不同的评价方法(MSE,MAE,RMSE,R2)等。 2比较说明sklearn的线性模…

断言(assert)的用法

参考:https://www.runoob.com/w3cnote/c-assert.html 目录作用总结与注意事项Demo作用 assert 是个宏,并且作用并非"报错"。 assert() 的用法像是一种"契约式编程",程序满足我的假设条件,才能正常良好的运作…

做视频素材资源(free视频,音频,图片)

素材资源 一、视频 Videezy :https://www.videezy.com/ Videovo:https://www.videvo.net/ mixkit:https://mixkit.co/,可以 distill:https://wedistill.io/ splitshire:https://www.splitshire.com/ pixa…

Mysql常见指令以及用法(保姆级)

文章目录基础篇通用语法及分类DDL(数据定义语言)数据库操作注意事项表操作DML(数据操作语言)添加数据注意事项更新和删除数据DQL(数据查询语言)基础查询条件查询聚合查询(聚合函数)分…