出门一笑, “栈” 落江横 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

前言

说完数据结构的链表小专题,小编今天带来了我们这节非常有意思的 一种非常有意思的数据结构,实不相蛮,栈也是我们线性表中的一种结构哦 💥 💥 💥

目录

  1. 栈的初识
  2. Stack 类
  3. 栈的实现

请添加图片描述

一. 栈的初识

1. 栈的简介

栈:一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作。 进行 数据插入和删除操作的一端 称为栈顶 ,另一端称为栈底。栈中的数据元素遵守 后进先出 LIFO(Last In First Out)的原则。

而利用我们的 对数据操作时

我们主要有两种方式

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在 栈顶
出栈:栈的删除操作叫做 出栈 。出数据在栈顶

在这里插入图片描述

鱼式疯言

我们可以贴近生活去理解我们的

压入子弹和出子弹的时候,就是栈的 出栈和入栈
在这里插入图片描述
羽毛球入球桶和出球桶, 就是栈的 出栈和入栈
在这里插入图片描述

二. Stack 类

1.Stack 的简介

在我们的Java的数据结构的集合类中, 内部就提供了那么一种 的类

在这里插入图片描述

我们就成为 Stack 类,而这个类就实现了我们 栈的所需要的功能

2. Stack 的使用

<1>. 入栈

class Test {public static void main(String[] args) {Stack<Integer> s=new Stack<>();s.push(1);s.push(2);s.push(3);}
}

在这里插入图片描述

无论怎么存放,都是 先存放的放栈底,后存放的放栈顶

<2>. 出栈

class Test {public static void main(String[] args) {Stack<Integer> s=new Stack<>();// 先在栈顶入栈s.push(1);s.push(2);s.push(3);// 然后在栈底出栈System.out.println(s.pop());System.out.println(s.pop());}
}

在这里插入图片描述

出栈也如此,放在 栈顶的元素先出,栈底的元素后出 ,也就意味着 先入后出

<3>. 查栈

class Test {public static void main(String[] args) {Stack<Integer> s=new Stack<>();// 先在栈顶入栈s.push(1);s.push(2);s.push(3);// 然后在栈底出栈System.out.println(s.pop());  // 3System.out.println(s.pop());  // 2// 查看当前栈顶元素System.out.println(s.peek());  // 1System.out.println(s.peek());  // 1}
}

在这里插入图片描述

最终呈现出来的效果是一直打印 栈顶 的元素

故查栈时,只能查看当前 栈顶元素

<4>栈的大小以及是否为空

栈的大小

class Test {public static void main(String[] args) {Stack<Integer> s=new Stack<>();// 先在栈顶入栈s.push(1);s.push(2);s.push(3);System.out.println("=========== 栈的大小 ======");System.out.println(s.size());}
}

在这里插入图片描述

  • 根据返回值的数字来判断栈中大小

栈是否为空

class Test {public static void main(String[] args) {Stack<Integer> s=new Stack<>();// 先在栈顶入栈s.push(1);s.push(2);s.push(3);System.out.println("=========== 栈的大小 ======");System.out.println(s.size());System.out.println("========栈是否为空=========");if (s.empty()) {System.out.println("该栈为空!");} else {System.out.println("该栈不为空!");}}
}

在这里插入图片描述

根据返回的布尔类型来判断栈是否为空

鱼式疯言

  • 返回 true 说明为
  • 返回 false 说明 不为空

以上是我们栈的主要功能

可能有一些碎片化的功能小编可能未提及,小编个人认为不是很重要,小伙伴们只要掌握以上Stack 的 4 种功能 即可

竟然是程序员,肯定少不了实操的嘛,下面就让小编带着友友们来实现我们的 吧 💖 💖 💖

三. 栈的实现

在这里插入图片描述

1. 构建栈的底层

说到栈的先入后出的特点, 我们不得不想起我们之前学过的顺序表和链表

小伙伴们是不是觉得很相似呢,入栈不就相当于 尾插 么,出栈不就相当于 尾删

竟然两者都能实现,那么我们该选择顺序表还是链表好呢,小编认为自然是选择顺序表更优一点

这是为啥呢 ?

因为啊我们的顺序表本质上是 数组

而我们的数组本身就是一块连续的空间,所以不管我们尾插还是尾删数据时,自然选择我们的顺序表更恰当咯 😁 😁 😁

public class MyStack implements IStack{// 定义一个栈public int []elem;public MyStack() {this.usesize = 0;this.elem =new int[SIZEMAX];}// 现有栈元素大小public  int usesize;
}

2. 入栈

请添加图片描述

// 入栈@Overridepublic void push(int val) {if (isFull()) {this.elem= Arrays.copyOf(elem,2*elem.length);}elem[usesize]=val;usesize++;}// 检查栈是否满private boolean isFull() {return usesize==size();}

在这里插入图片描述

入栈是容易,但小伙伴们可不要掉以轻心哦,当我们入栈时,一定要注意数组的空间是否足够

如果不够一定要及时的 扩容

具体扩容细节可以参考的我们 Java篇 的顺序表哦

顺序表详解链接

3. 出栈

请添加图片描述

// 去除栈顶元素@Overridepublic int pop() {if (isEmpty()) {return -1;}int ret=elem[usesize-1];
//         elem[usesize]=null;usesize--;return ret;}//检查是否空@Overridepublic boolean isEmpty() {return usesize==0;}

在这里插入图片描述

首先我们得判断该栈元素是否为 ,这时我们就可以用到我们自己写的 isEmpty() 方法 啦。如果成立就返回 -1

然后出栈就没有我们入栈那么细节的需要考虑增容的情况啦,我们只需要把 有效元素大小减少一位 即可 💖 💖 💖

鱼式疯言

但要注意一点哦,如果该数据类型是 引用数据类型 就需要 置空

// elem[usesize]=null;

4. 查栈


// 喵一眼栈顶元素
@Override
public int peek() {if (isEmpty()) {return -1;}return elem[usesize-1];
}//检查是否空@Overridepublic boolean isEmpty() {return usesize==0;}

在这里插入图片描述

peek() 方法中, 我们只需要返回当前 栈顶 的元素即可。

5.栈的大小以及是否为空

//检查是否空
@Override
public boolean isEmpty() {return usesize==0;
}// 返回栈的大小
@Override
public int size() {return usesize;
}

在这里插入图片描述

在这里插入图片描述

检查栈是否为空只需要是否等于 0 即可

6. 程序逻辑与接口代码展示

package stack;public interface IStack {int SIZEMAX=10;// 入栈void push(int val);// 出栈int pop();// 喵栈int peek();// 是否空boolean isEmpty();// 栈的大小int size();}

package stack;public class TestStack {public static void main(String[] args) {MyStack ms=new MyStack();// 入栈ms.push(1);ms.push(2);ms.push(3);ms.push(4);ms.push(5);System.out.println("======出栈元素======");// 出栈// 先出栈顶System.out.println(ms.pop());  // 5System.out.println(ms.pop());  // 4System.out.println(ms.pop()); // 3System.out.println("=======查栈元素==========");// 看栈顶System.out.println(ms.peek());System.out.println(ms.peek());System.out.println("========查栈大小========");// 栈的大小System.out.println(ms.size);System.out.println("=======查栈是否为空=======");if (ms.isEmpty()) {System.out.println("MyStack 为空!");} else {System.out.println("MyStack 不为空!");}}
}

鱼式疯言

这里我们的数据类型是以 int 的整型数据类型。但我们是可以给我们的数组添加泛型来实现我们 多样数据类型 的栈,还是利用我们的 顺序表 的优化来是可以实现哦 (只需要改成泛型即可)

顺序表的优化详解链接

总结

  • 栈的初识: 我们认识了栈是什么,以及栈的特征和功能
  • Stack 类: Java内部用了我们 Stack 这个类 来实现我们出入栈的各种功能
  • 栈的实现: 我们动手实现了栈的主要的功能和以及说明了实现的细节要点

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

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

相关文章

03-自媒体文章发布

自媒体文章发布 1)自媒体前后端搭建 1.1)后台搭建 ①&#xff1a;资料中找到heima-leadnews-wemedia.zip解压 拷贝到heima-leadnews-service工程下&#xff0c;并指定子模块 执行leadnews-wemedia.sql脚本 添加对应的nacos配置 spring:datasource:driver-class-name: com…

23年蓝桥杯省赛 动态规划DP

动态规划 就是:给定一个问题&#xff0c;我们把它拆成一个个子问题&#xff0c;直到子问可以直接解决。然后把子问题的答案保存起来&#xff0c;以减少重量计算&#xff0c;再根据子问题答察反推&#xff0c;得出问解的一种方法。 题目&#xff1a; 这天&#xff0c;一只蜗牛…

QT串口接收数据并进行波形显示(含源码)

**使用QT在串口调试助手基础上实现波形显示&#xff08;含源码&#xff09; 评论比较多留言需要源码的&#xff0c;逐个发邮箱比较麻烦也不能及时回复&#xff0c;现将源码上传至链接&#xff08;无需积分下载&#xff09;https://download.csdn.net/download/m0_51294753/877…

cJSON(API的详细使用教程)

我们今天来学习一般嵌入式的必备库&#xff0c;JSON库 1&#xff0c;json和cJSON 那什么是JSON什么是cJSON&#xff0c;他们之间有什么样的关联呢&#xff0c;让我们一起来探究一下吧。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&…

C和C++内存管理

目录&#xff1a; 一&#xff1a;C和C内存分布 二&#xff1a;C动态内存管理方式 三&#xff1a;C动态内存管理方式 四&#xff1a;operator new与operator delete函数 五&#xff1a;new和delete的实现原理 六&#xff1a;定位new表达式(placement-new) 七&#xff1…

使用YOLOv8训练自己的【目标检测】数据集

文章目录 1.收集数据集1.1 使用开源已标记数据集1.2 爬取网络图像1.3 自己拍摄数据集1.4 使用数据增强生成数据集1.5 使用算法合成图像 2.标注数据集2.1确认标注格式2.2 开始标注 3.划分数据集4.配置训练环境4.1获取代码4.2安装环境 5.训练模型5.1新建一个数据集yaml文件5.2预测…

了解IP地址的基本概念和修改步骤

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;其重要性不言而喻。无论是为了提升网络性能&#xff0c;还是出于隐私保护的需求&#xff0c;修改IP地址都是网络使用者可能遇到的操作。虎观代理将详细介绍如何修改IP地址&#xff0c;并探讨在修改过程中需要…

python+flask+django文献文件资料搜索系统

后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 本系统在设计过程中&#xff0c;很好地发挥了该开发方式的优…

例47:键盘事件演示

建立一个EXE工程&#xff0c;在默认窗体上放一个Image框和一一个text框。在text的按键事件中输入代码&#xff1a; Function Form1_Text1_WM_KeyDown(hWndForm As hWnd, hWndControl As hWnd,nVirtKey As Long, lKeyData As Long) As LongIf nVirtKey VK_SPACE ThenImage1.Pi…

Linux:IO多路转接之select

文章目录 selecttimeval结构体fd_set 优缺点分析完整代码 本节要介绍的主题是多路转接式IO select 先说结论&#xff0c;这个select是做什么的呢&#xff1f; select是负责在Linux系统中&#xff0c;让一个人可以有多个鱼竿&#xff0c;可以不停的进行轮询&#xff0c;只要有…

Trace链异常检测汇总

微服务应用与单块应用完全不同&#xff0c;一个微服务系统少则有几十个微服务组成&#xff0c;多则可能有上百个服务。比如BAT级别的互联网公司&#xff0c;一般都超过上百个服务&#xff0c;服务之间的依赖关系错综复杂&#xff0c;如果没有有效的监控手段&#xff0c;那么出现…

[计算机知识] 各种小问题思考

哈希算法以及哈希冲突 哈希算法&#xff1a;将任何长度的输入通过散列函数转换成固定长度的字符串 哈希冲突&#xff1a;不同的输入经过哈希函数处理后得到相同的哈希值 因为哈希函数的输出域是有限的 解决哈希冲突&#xff1a; 1. 开放寻址&#xff1a;产生哈希冲突后&…

Vue - 1( 13000 字 Vue 入门级教程)

一&#xff1a;Vue 导语 1.1 什么是 Vue Vue.js&#xff08;通常称为Vue&#xff09;是一款流行的开源JavaScript框架&#xff0c;用于构建用户界面。Vue由尤雨溪在2014年开发&#xff0c;是一个轻量级、灵活的框架&#xff0c;被广泛应用于构建单页面应用&#xff08;SPA&am…

创建和启动线程

概述 Java语言的JVM允许程序运行多个线程&#xff0c;使用java.lang.Thread类代表线程&#xff0c;所有的线程对象都必须是Thread类或其子类的实例。 Thread类的特性 每个线程都是通过某个特定Thread对象的run()方法来完成操作的&#xff0c;因此把run()方法体称为线程执行体。…

使用神经网络-遗传算法优化神经网络-风电预测故障(BP,GABP,matlab)

本项目是故障预测&#xff0c;不是时序预测&#xff0c;本质还是分类问题 1 数据集介绍 特征文件&#xff1a; 标签文件&#xff1a;共计4个标签&#xff0c;其中大多数都是正常的&#xff0c;其他是3个不正常的类别 2 使用BP网络 2.1 读取数据&#xff0c;然后选择几个…

【深度学习】图像自然语言描述生成

案例 6&#xff1a;图像自然语言描述生成&#xff08;让计算机“看图说话”&#xff09; 相关知识点&#xff1a;RNN、Attention 机制、图像和文本数据的处理 1 任务目标 1.1 任务和数据简介 ​ 本次案例将使用深度学习技术来完成图像自然语言描述生成任务&#xff0c;输入…

MySQL复制拓扑2

文章目录 主要内容一.配置基本复制结构1.分别在三台主机上停止mysqld服务&#xff0c;并对状态进行确认&#xff1a;代码如下&#xff08;示例&#xff09;: 2.对三个MySQL服务器的配置文件分别进行编辑&#xff0c;在[mysqld] 选项组中添加以下红色条目&#xff1a;3.在数据目…

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面&#xff0c;异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式&#xff1b; 1.利用trycatchfinaly语句处理异常&#xff0c;优点是分开了处理异常代码和程序正常代码…

深入浅出 -- 系统架构之负载均衡Nginx反向代理

一、Nginx反向代理-负载均衡 首先通过SpringBootFreemarker快速搭建一个WEB项目&#xff1a;springboot-web-nginx&#xff0c;然后在该项目中&#xff0c;创建一个IndexNginxController.java文件&#xff0c;逻辑如下&#xff1a; Controller public class IndexNginxControl…

【放假第3天】幻兽帕鲁 雾锁王国 我的世界 游戏云服务器选购指南 附最新价格对比表 新手、小白秒懂

更新日期&#xff1a;4月6日&#xff08;半年档 价格回调&#xff0c;京东云采购季持续进行&#xff09; 本文纯原创&#xff0c;侵权必究 【云服务器推荐】价格对比&#xff01;阿里云 京东云 腾讯云 选购指南视频截图 《最新对比表》已更新在文章头部—腾讯云文档&#xf…