第四章 栈与队列

4.2 栈的定义

4.2.1 栈的定义

栈是限定仅在表尾进行插入和删除操作的线性表,栈的特点是先进去的后出来,后进去的先出来,这种结构称之为后进先出(Last in Frist out)的线性表,简称为LIFO结构
我们把允许插入删除的一端称之为栈顶(top),另一端称之为栈底(bottom),不含任何数据元素的为空栈

注意,栈也是一个线性表

栈的插入操做,叫做进栈,删除操作,叫做出栈

4.2.2 进栈出栈的变化形式

最后进栈的不一定先出栈,只要保证栈顶的元素首先出栈即可

4.3 栈的抽线数据类型

4.4 栈的顺序存储结构及实现

4.4.1 栈的顺序存储结构

我们用数组来实现栈,首先,我们规定数组中下标为0的一端为栈底,因为这一端不会进行频繁的数据增删操作。我们把数组的最后位置设为栈顶,因为该端会进行频繁的数据增删操作

若存储栈的长度为StackSize,则栈顶top必须小于StackSize。注意,当栈中只有一个元素时,top = 0,所以如果为空栈,则top = -1

代码实现:

4.4.2 栈的顺序存储结构——进栈操作

4.4.3 栈的顺序存储结构——出栈操作

进栈时,现将栈顶指针加一,再将数据赋值给栈顶
出栈时,先删除数据,再将栈顶指针减一
进栈出栈的时间复杂度都是O(1)

4.5 两栈共享空间

对于两个相同数据类型的栈,各自开辟了数组空间,极有可能一个栈已经满了,但是第二个栈还有很多空间。我们可以用一个数组空间存储两个栈

我们将两个栈的栈顶相对,存放在一个数组中

核心思想是:向中间靠拢,而两个栈见面时,就是栈满的时刻,此时top1 + 1 = top2

两个栈的共享空间结构

如果向栈中插入数据,还需要明确是在栈1中压入还是在栈2中压入

而出栈是这样的,也要判断是栈1中数据还是栈2中数据

先将栈中元素保存取出之后再将栈顶指针进行加一或者减一

将两个栈存入在一个数组中通常是一方栈增长,另一方栈就减短的情况
而且一定要注意两栈共享空间,这两个栈一定是相同数据类型

4.6 栈的链式存储结构及实现

4.6.1 栈的链式存储结构

栈的链式存储结构,简称为链栈。我们把栈顶作为头部,栈底作为尾部

链栈为空就是top = NULL

结构代码如下:

4.6.2 栈的链式存储结构——进栈操作

直接放出代码和示意图:

4.6.3 栈的链式存储结构——出栈操作

直接放出代码和示意图:

4.10 队列的定义

队列是只允许在一端进行删除,在另一端进行插入的线性表

队列是一种先进先出(First in First out)的结构,简称FIFO结构。我们把插入数据的一端称之为队尾,把删除数据的一端称之为队头,就像排队打饭一样,后来的排在队尾,最前面的队头打完饭走了

4.11 队列的抽象数据类型

4.12 循环队列

4.12.1 队列顺序存储的不足

假设我们有一个队列由n个元素,按照顺序存储,我们应该建立一个数组长度大于n的数组。

数据加入队列时,会直接添加在队尾,此时时间复杂度为O(1)

数据出队列时,第一个元素出去,后面的n-1个元素都要向前移动一小步,此时的时间复杂度为O(n):

在数据出队列时,如果我们不去限制数据必须存储在前n个位置,即下标为0的位置不是必须要有数据的,则出队的时间复杂度会降到O(1):

这里插入一下,为了方便,我们引入两个指针front和rear,front指向队头的数据,rear指向队尾的后一格数据,所以,如果当front = rear时,此队列为空队列

我们接回上提,在我们去除了数据必须存放在数组的前n个位置这个限制后,时间复杂度为O(1),看起来还不错,但是我们看队尾,一直插入数据,rear不断后移,直到rear跑出该数组,数据溢出。但是我们发现,之前数据删除后,front前面还留着很多空位,该数组并没有被填满,显然,这种溢出是“假溢出”

4.12.2 循环队列的定义

由于队列的顺序存储结构存在不足,所以我们引入了循环队列来解决这个问题

我们把队列头尾相接的顺序存储结构称为循环队列

接着上面的例子,在数据存到数组的最后一个位置时,我们将rear指向队头,这样就不会造成“假溢出”的情况

然后正常增加数据,直到rear = front时队列变满

但是此时我们发现一个问题,当rear = front时,到底是队满还是队空?

为了解决这个问题,我们修改了队满的条件,即保留一个元素空间

解决这个问题之后我们又发现了新问题,rear可能会比front大,也可能会比front小,所以尽管rear和front只差了一个位置,可能是队满,也有可能是差了整整一大圈

所以,我们定义队满的条件是:

(rear + 1)%QueueSize == front

QueueSize为队列长度

另外,我们在算队列长度时,有两种情况:

1、若rear > front:则队列长度直接是rear - front

2、若rear < front:则队列长度分为两部分,一部分是QueueSize - front,另一部分是0 + rear,队列长度为rear - front + QueueSize

所以,通用的队列长度公式为:

(rear - front + QueueSize)%QueueSize

下面我们看看代码吧

循环队列的顺序存储结构的代码:

循环队列初始化的代码:

循环队列求队列长度代码:

循环队列的入队代码:

循环队列的出队代码:

4.13 队列的链式存储结构及实现

队列的链式存储结构,其实就是只能头出尾进的线形单链表而已,简称链队列

我们将front指向头结点,rear指向终端结点

空队列时,front和rear都指向头结点

4.13.1 队列的链式存储结构——入队操作

其实就是在队尾增加数据

代码如下:

4.13.2 队列的链式存储结构——出队操作

出队操作就是将front指向后继数据,与入队相比,多出了一个步骤,就是在最后一个元素出队时,要将rear指向头结点

代码实现如下:

ssm插入数据时候栈溢出_大话数据结构笔记(4)相关推荐

  1. ssm插入数据时候栈溢出_程序员算法与数据结构基础中的基础,栈与递归

    在此之前,我们介绍了动态规划.深度优先搜索等基础算法,但是,有部分好友评论说,难度太难了,我们知道动态规划的自顶向下跟深度优先搜索一般都用递归实现,今天我们就先来讲讲算法与数据结构中,基础中的基础递归 ...

  2. 大话数据结构笔记-图

    大话数据结构笔记-图 定义 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为 G(V,E), 其中 G表示一个图, V是图G中的顶点的集合, E是图G中边的集合. 顶点就是图中 ...

  3. springboot和vue data数据为空_常见数据结构的 Python 实现(建议收藏)

    数据结构作为计算机基础的必修内容,也是很多大型互联网企业面试的必考题.可想而知,它在计算机领域的重要性. 然而很多计算机专业的同学,都仅仅是了解数据结构的相关理论,却无法用代码实现各种数据结构. 今日 ...

  4. mysql数据库插入数据为空_插入数据成功,但是数据库中显示为空(菜鸟提问)...

    插入数据成功,但是数据库中显示为空(初学者提问). 这个问题很菜,实在是找不到办法. 为什么往数据库中插入数据显示成功,但是数据库中显示是空. +------+------+ |   name   | ...

  5. mysql数据库插入数据为空_用java向mysql数据库中插入数据为空

    利用java面向对像编程,向数据库中插入数据时.遇到插入的数据为空的情况.在此做一小结: 1.数据库连接正正常 2.sql语句没有问题 3.程序没有报异常 4.代码: import java.util ...

  6. C语言数据结构(大话数据结构——笔记1)数据结构绪论、算法、线性表

    [C语言描述]<数据结构和算法> 说是这个教程是按照<大话数据结构>这本书来编写的:数据结构与算法经典书籍--大话数据结构(带配套源码) ↑废话太TM多了,换一个! [搞定数据 ...

  7. 大话数据结构 java源代码_大话数据结构(八)Java程序——双向链表的实现

    packagecom.aclie.dataStructe4.sqeList;public classMyDoubleLinkList {private int length =0;//当前长度 pri ...

  8. datetime插入数据_SQL项目_(一)数据源准备

    1 数据集查看(EmEditor Pro64_18.6.6,查看数据样张) 打开EmEditor,拖入需要查看的csv数据文件,够用点击停止,切换成csv现实格式:收集分隔符信息 2 导入 2.1 N ...

  9. 大数据产业链结构_【数据结构 | 大整型】

    创建一个无长度限制的大整型,并实现加减乘除等功能 参考: https://blog.csdn.net/qq_36894136/article/details/79074728 https://blog ...

最新文章

  1. 机器视觉系统设计关键:成像基准
  2. 余承东和张小龙背后的故事:成年人,请远离线性努力
  3. a16z基金:顶级风投眼中的2019技术趋势
  4. 文本超出显示省略号/数字英文字母折行有关css 属性/显示两行,第二行省略号显示css方法...
  5. HDU-2089-不要62
  6. 绝地求闪退be服务器未运行,绝地求生大逃杀BE启动失败,应用程序无法正常启动...
  7. c语言 goto 跳出循环,goto语句可以跳出循环.ppt
  8. python调用winrar解压_批量文件解压缩脚本(Python3.5 + WinRAR)
  9. 一晚啪了5只喵,累到在医院打点滴,这中国喵把英国人看傻了 | 今日最佳
  10. php中glob怎么用,如何在php中利用glob函数对文件进行遍历
  11. 直接上手!不容错过的 Visual Studio Code 十大扩展组件
  12. Nagios客户端的安装步骤(要监控的服务器)
  13. ISO语言代码(ISO-639)与国家代码(ISO-3166)
  14. android锁屏事件监听,Android 监听锁屏、解锁、开屏 操作
  15. 小提琴统计图_(翻)云(覆)雨图-小提琴图,密度图、箱线图组合
  16. CVPR 2021 | 让机器想象未见的世界!反事实的零次和开集识别
  17. 前端学习笔记____Vue2+Vue3全家桶
  18. 如何制作价目表制作报价单
  19. 【入门教程】必看!TensorFlow中文教程:机器学习从零到一
  20. pandas分组分析:GroupBy和pandas交叉分析:pivot_table/crosstab【学习记录】

热门文章

  1. minimap2 长reads比对工具
  2. Ubuntu E: Unable to locate package错误解决办法
  3. java opennlp_使用opennlp进行文档分类
  4. windows10中 git 本地仓库的使用
  5. Python通过http、url获取数据
  6. 【JVM】StackOverflowError与OutOfMemoryError
  7. AI 利用BP算法及Sigmoid函数,研究函数f(x)=2sinx-0.7的逼近问题-实验报告
  8. Kubernetes学习笔记三:Docker安装,Docker使用,编写Dockerfile,制作容器镜像,上传docker镜像
  9. python实现mysql事务_python连接mysql并提交mysql事务示例
  10. C++_泛型编程与标准库(五)