当前位置: 首页 > article >正文

JAVA初阶数据结构栈(工程文件后续会上传)(+专栏数据结构练习是完整版)

1.栈的概念讲解(Stack))

定义:栈是一种先进后出的数据结构

要想拿到12就要把它头上的所有东西给移出去 

 2.栈的实现(代码)

2.1栈的方法逻辑的讲解

(1)新建一个测试类Frank

(2)进入源码进行分析

其中栈就只有3个方法

pop (弹出元素)stack (放入元素)peek(输出元素)

其中如果选中pop相当于删除这个要弹出的元素

其中如果选中peek相当于获取栈内元素但是不删除

empty方法是用来判断栈是否为空的

(3)图解

栈本质上是一个数组()

定义一个useSize它的作用写道图片里面了

2.2栈中的push方法的实现(压栈操作)

先定义一个数组,(栈就是数组)然后定义一个数组长度usesize代表数组的长度,elem是数组,然后定义一个长度为10的数组。

 鉴于我们之前实现的顺序表的操作,我们首先要先定义一个判断栈是否为满的方法(isFull方法)

这个方法

 之后利用这个方法来实现入栈操作

如果这个数组为满,那么数组的长度就扩容两倍,之后useSize的第useSize+1的位置等于要先高要加入的元素

 2.3pop方法(弹出栈定元素操作)

我们删除只需要将上面的代码给usedSize给变成--然后剪刀3位置,然后回收

代码实现

首先定义一个isEmpty方法来判断数组是否为空

定义一个异常类,当发生数组为空的时候记得报错。

总体代码

 2.4peek(查看栈中元素(栈定元素)操作)

既然我们不需要进行弹出,那么我们就不需要usesize--来对数组(栈)进行操作

所以和上面代码差不多,如果想简化可以把return old改成elem【usiedsize--】

代码实现

2.5. 总结

入栈出栈的时间复杂度都为1,

2.6通过链表实现栈

通过链表实现栈可以使用单链表,也可以使用双链表,不管使用哪个链表一定要保证,入栈出栈的操作时间复杂度都为o(1)(我写的这些是为了能够让你们更好的了解)

2.6.1单向链表实现栈(可以实现队列和栈)

如果用尾插法那么遍历整个链表就不是o(1)

所以要用头插法

入栈用头插法

删除就删除头结点

图解

2.6.2双向链表实现栈(可以实现队列和栈)

双向链表的化head和last都可以来实现栈

由于在jdk中实现的就是双向链表,所以我们实例化一个双向链表

进入源码

 可以看到在源码中又push方法来压栈

其中还有pop方法来弹出栈

还有peek方法

k


http://www.kler.cn/a/271718.html

相关文章:

  • 上位机知识篇---GitGitHub
  • jEasyUI 转换 HTML 表格为数据网格
  • Node.js 的底层原理
  • android 音视频系列引导
  • 17 一个高并发的系统架构如何设计
  • 网站如何正式上线(运维详解)
  • 【设计模式】Java 设计模式之装饰者模式(Decorator)
  • 浅谈C/C++的常量const、指针和引用问题
  • 用Stable Diffusion生成同角色不同pose的人脸
  • C#使用SharpZipLib对文件进行压缩和解压
  • NCV8705MTADJTCG稳压器芯片中文资料规格书PDF数据手册引脚图图片价格功能
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Search)
  • venv uvicorn python 虚拟服务器外网无法访问
  • swagger踩坑之请求类不显示具体字段
  • Redis + Caffeine = 王炸!!
  • Spring项目-前端问题:Can‘t find variable:$
  • 通用的springboot web jar包执行脚本,释放端口并执行jar包
  • PHP修改默认上传文件缓存位置
  • PC-DARTS: PARTIAL CHANNEL CONNECTIONS FOR MEMORY-EFFICIENT ARCHITECTURE SEARCH
  • HamonyOS进度条通知
  • 请解释Redis是什么?它有哪些主要应用场景?Redis支持哪些数据类型?并描述每种数据类型的特性和使用场景。
  • 1.实用Qt:解决绘制圆角边框时,圆角锯齿问题
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridItem)
  • SQL注入无回显,利用DNSlog构造方式
  • 力扣-3. 无重复字符的最长子串
  • Vue+SpringBoot打造康复中心管理系统