出门一笑, “栈” 落江横 (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.hqwc.cn/news/595762.html

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

相关文章

C语言中strcpy函数的实现

C语言中strcpy函数的实现 为了便于和strcpy函数区别&#xff0c;以下命令为_strcpy。 描述&#xff1a;实现strcpy&#xff0c;字符串拷贝函数&#xff0c;函数原型如下&#xff1a; char* strcpy(char* _Destination, const char *_Source);_strcpy实现&#xff1a; char*…

指针 基础知识

本笔记为观看56 指针-指针的定义和使用_哔哩哔哩_bilibili后的学习笔记 指针的定义和使用 1、定义指针 int main () {//1、定义指针int a 10;//指针定义的语法&#xff1a; 数据类型 * 指针变量名&#xff1b;int * p;//让指针记录变量a的地址p &a; //& 为取址符cou…

学习Python的第四天

使用工具 PyCharm Community Edition 2023.3.4 使用环境 Python3.10.4 目录 1.字面量 1.1 值的类型 1.2 字面量的写法 2.注释 2.1 注释的作用 2.2 单行注释 2.2.1 语法 2.3 多行注释 2.3.1 语法 2.3.2 一般用来解释 2.4 注释示例 2.4.1 运行结果 3.变量 3.1…

【轻松一刻】中国茶叶探索奇妙之旅

文章目录 茶多酚 茶叶大类 龙井茶 泡茶方法 茶叶保存 参考资料 茶多酚 茶多酚是形成茶叶色香味的主要成份之一&#xff0c;也是茶叶中有保健功能的主要成份之一。茶多酚的副产品咖啡因&#xff0c;又称为咖啡碱&#xff0c;能兴奋大脑皮层&#xff0c;所以喝茶有提神作用…

【单片机】PMS5003,PM2.5传感器数据读取处理

文章目录 传感器介绍数据处理解析pm2.5的代码帮助、问询 传感器介绍 PMS5003是一款基于激光散射原理的数字式通用颗粒物浓度传感器,可连续采集 并计算单位体积内空气中不同粒径的悬浮颗粒物个数,即颗粒物浓度分布,进而 换算成为质量浓度,并以通用数字接口形式输出。本传感器可…

ES学习日记(八)-------ik安装和简易使用

一、下载和安装 https://github.com/infinilabs/analysis-ik.git 网络不好可以用这个地址,注意:ik版本要和es版本保持一致 现成地址 注意es用户操作或给es用户权限 plugins新建ik文件夹,并把压缩包解压到ik unzip elasticsearch-analysis-ik-7.4.2.zip /bin目录启动es: 二…

MySql并发事务问题

事务 事务概念&#xff1a; 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 事务的特性&#xff1a;ACID&#xff1a; 小…

【HTML】CSS样式(二)

上一篇我们学习了CSS基本样式和选择器&#xff0c;相信大家对于样式的使用有了初步认知。 本篇我们继续来学习CSS中的扩展选择器及CSS继承性&#xff0c;如何使用这些扩展选择器更好的帮助我们美化页面。 下一篇我们将会学习CSS中常用的属性。 喜欢的 【点赞】【关注】【收藏】…

【SCI绘图】【曲线图系列1 python】绘制扫描点平滑曲线图

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【曲线图1 python】绘制扫描点平滑曲线图 1.环境准备 python 3 import numpy as np import pandas as pd import proplot …

面试算法-139-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…

电脑上音频太多,播放速度又不一致,如何批量调节音频播放速度?

批量调节音频速度是现代音频处理中的一个重要环节&#xff0c;尤其在音乐制作、电影剪辑、有声书制作等领域&#xff0c;它能够帮助制作者快速高效地调整音频的播放速度&#xff0c;从而满足特定的制作需求。本文将详细介绍批量调节音频速度的方法、技巧和注意事项&#xff0c;…

ES6中模块化详解

一个兜兜转转&#xff0c;从“北深”回到三线城市的小码农&#xff0c;热爱生活&#xff0c;热爱技术&#xff0c;在这里和大家分享一个技术人员的点点滴滴。欢迎大家关注我的微信公众号&#xff1a;果冻想 前言 因为ES6中的模块化是将来&#xff0c;所以就必须有必要好好的了…