出门一笑, “栈” 落江横 (Java篇)
邂逅岁月 2024-06-20 13:05:04 阅读 52
本篇会加入个人的所谓‘鱼式疯言’
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
前言
说完数据结构的链表小专题,小编今天带来了我们这节非常有意思的 栈 一种非常有意思的数据结构,实不相蛮,栈也是我们线性表中的一种结构哦 💥 💥 💥
目录
栈的初识Stack 类栈的实现
一. 栈的初识
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()); // 3 System.out.println(s.pop()); // 2 // 查看当前栈顶元素 System.out.println(s.peek()); // 1 System.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. 入栈
// 入栈 @Override public 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. 出栈
// 去除栈顶元素 @Override public int pop() { if (isEmpty()) { return -1; } int ret=elem[usesize-1];// elem[usesize]=null; usesize--; return ret; } //检查是否空 @Override public boolean isEmpty() { return usesize==0; }
首先我们得判断该栈元素是否为
空
,这时我们就可以用到我们自己写的isEmpty
() 方法 啦。如果成立就返回-1
然后出栈就没有我们入栈那么细节的需要考虑增容的情况啦,我们只需要把 有效元素大小减少一位 即可 💖 💖 💖
鱼式疯言
但要注意一点哦,如果该数据类型是 引用数据类型 就需要 置空
// elem[usesize]=null;
4. 查栈
// 喵一眼栈顶元素@Overridepublic int peek() { if (isEmpty()) { return -1; } return elem[usesize-1];} //检查是否空 @Override public boolean isEmpty() { return usesize==0; }
在 peek() 方法中, 我们只需要返回当前 栈顶 的元素即可。
5.栈的大小以及是否为空
//检查是否空@Overridepublic boolean isEmpty() { return usesize==0;}// 返回栈的大小@Overridepublic 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()); // 5 System.out.println(ms.pop()); // 4 System.out.println(ms.pop()); // 3 System.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 这个类 来实现我们出入栈的各种功能 栈的实现: 我们动手实现了栈的主要的功能和以及说明了实现的细节要点如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。