你有用过 java中的栈和队列吗?怎么用栈来实现队列呢

简介: 你有用过 java中的栈和队列吗?怎么用栈来实现队列呢

一、前言

本篇文章从栈和队列的定义到 java实现,再到 LeetCode 232题来实现一下,怎么用栈来实现队列

在今天我开始刷栈和队列相关算法了,在 java中栈和队列的类是 Stack和 Queue, 但是在 java中我好像很少甚至根本就没有写过相关的代码,不知道小伙伴们是不是和我一样,这次就借着刷 LeetCode的机会来重温一下相关的知识

本文隶属于我的 算法专栏感兴趣的可以关注一下

二、栈和队列

基础知识

栈和队列的基础知识应该是耳熟能详的了吧,栈是先进后出,队列是先进先出

栈有两种实现方式,一种是数组,一种是链表,栈的先进后出如图所示:

网络异常,图片无法展示
|

队列的先进先出如图所示:

网络异常,图片无法展示
|

java中的栈

在 java中,类 Stack实现了一个标准的先入后出堆栈,通过查看源代码我们可以发现,Stack类实现了 Vector类

Vector类实现了动态数组,和 ArrayList相似,但是两者是不同的

  • Vector是同步的
  • vector包含了许多方法,这些方法是不属于集合框架的

通过 idea的方法提示,我们可以看到 Stack自定义了以下五个方法他们的作用分别是:

  • push:  压栈,也可以称为进栈
  • empty:判断当前栈是否为null
  • peek:      查看栈顶部对象,不将其删除
  • pop:        删除该堆栈的顶部对象,并返回所删除的对象
  • search:  返回对象在堆栈中的位置,以 1为基数,0表示理想对象,返回值为 int类型

网络异常,图片无法展示
|

下面我们对 Stack类进行方法测试,测试结果如下图所示:

  • 创建栈对象
  • 判断当前栈是否为空
  • 进行压栈,压栈元素为 a
  • 判断当前栈是否为空
  • 查看栈顶部对象
  • 进行压栈,压栈元素为 b
  • 查看栈顶部对象
  • 调用父类 Vector的方法,查看当前栈内的元素
  • 查看元素 a在栈中的位置
  • 查看元素 b在栈中的位置
  • 查看栈顶对象,并删除
  • 调用父类 Vector的方法,查看当前栈内的元素

网络异常,图片无法展示
|

对栈不熟悉的建议花几分钟去调用方法看一下,虽然可能大概不常用

java中的队列

在 java中的队列是 Queue,但是这个类是一个接口,它定义了队列相关的方法,具体实现要看他的子类

网络异常,图片无法展示
|

Queue定义的方法如下:

  • add:添加元素,失败会抛出异常
  • offer:添加元素
  • remove:删除元素,失败会抛出异常
  • poll:返回第一个元素,并删除
  • element:返回第一个元素
  • peek:查看栈顶元素,不将其删除

本篇文章以 LinkedList为例去试验一下队列的几个方法,后面有机会的话,可以专门出一篇文章讲一下队列

网络异常,图片无法展示
|

三、实践

俗话说得好,好记性不如烂笔头,有没有学明白试一下就知道了,刚好今天做了 LeetCode上的一道题目,两个知识点都有所涉及

LeetCode 232. 用栈实现队列

题目描述

网络异常,图片无法展示
|

规定代码格式

同时 LeetCode规定了我们实现的代码格式,并告诉我们将要以下面注释部分的方式去实例化和调用我们实现的 MyQueue

网络异常,图片无法展示
|

思路分析

  • 通过本篇文章前面的讲解,我们了解了栈和队列的定义和基本方法
  • 由于栈是先进后出,队列是先进先出,那么想要用栈来实现队列肯定要有两个栈
  • 一个栈用来存储元素,第二个栈用来模拟队列的先入先出
  • 队列中添加元素 in栈中压入元素
  • 队列中弹出元素,in栈的元素弹出并压入 out栈,全部压入后弹出首元素
  • 具体如下图所示

网络异常,图片无法展示
|

注意题中 push方法的入参是 int类型

题中说明:所有操作都是合法的,代表着我们不用判断异常情况

只能使用栈来实现队列

代码展示

public class MyQueue {
    Stack<Integer> inStack;
    Stack<Integer> outStack;
    // 构造方法初始化 in栈和 out栈
    public MyQueue() {
        inStack = new Stack<>();
        outStack = new Stack<>();
    }
    // 添加元素
    public void push(int x) {
        inStack.push(x);
    }
    public int pop() {
        inToOut();
        // 弹出 out栈的第一个元素
        return outStack.pop();
    }
    public int peek() {
        inToOut();
        return outStack.peek();
    }
    public boolean empty() {
        return inStack.empty() && outStack.empty();
    }
    public void inToOut(){
        // 如果 out栈中还有元素,则返回
        if (!outStack.empty()){
            return;
        }
        // 只要 in栈元素中还有数据就弹出并添加到 out栈中
        while (!inStack.empty()){
            outStack.push(inStack.pop());
        }
    }
}
复制代码

关于pop方法

关于 pop方法在将 inStack栈中的元素压栈到 outStack之后,有的小伙伴可能会有疑问,这里后面为什么没有在把 outStack的元素在压栈会 inStack来保证队列的顺序

下面我画了一个流程图,来表示执行 push操作和 pop操作过程中队列, inStack和 outStack的元素变化情况

我们最后可以看到,outStack就是表明了部分队列的元素顺序,所以不用再 pop过程中重新将 outStack内的元素放入到 inStack中

网络异常,图片无法展示
|

提交结果

网络异常,图片无法展示
|

总结

事实证明小白刷 LeetCode还是有用的,不仅能学习到更多的知识,也能够对已有的知识加深印象



目录
相关文章
|
4月前
|
存储 算法 Java
惊!Java程序员必看:JVM调优揭秘,堆溢出、栈溢出如何巧妙化解?
【8月更文挑战第29天】在Java领域,JVM是代码运行的基础,但需适当调优以发挥最佳性能。本文探讨了JVM中常见的堆溢出和栈溢出问题及其解决方法。堆溢出发生在堆空间不足时,可通过增加堆空间、优化代码及释放对象解决;栈溢出则因递归调用过深或线程过多引起,调整栈大小、优化算法和使用线程池可有效应对。通过合理配置和调优JVM,可确保Java应用稳定高效运行。
145 4
|
1月前
|
存储 算法 Java
🧠Java零基础 - Java栈(Stack)详解
【10月更文挑战第17天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
25 2
|
2月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
32 2
|
3月前
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。
|
2月前
|
存储 算法 Java
【用Java学习数据结构系列】用堆实现优先级队列
【用Java学习数据结构系列】用堆实现优先级队列
32 0
|
4月前
|
Java 索引
java中的栈(利用数组实现栈)
这篇文章通过Java代码示例介绍了如何使用数组实现栈操作,包括栈的初始化、入栈、出栈、判断栈满和空以及遍历栈的方法。
java中的栈(利用数组实现栈)
|
4月前
|
Java
java中的队列
这篇文章通过Java代码示例介绍了使用数组实现队列操作,包括队列的初始化、入队、出队、判断队列满和空以及遍历队列的方法。
java中的队列
|
5月前
|
Java 运维
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
开发与运维命令问题之使用jstack命令查看Java进程的线程栈如何解决
68 2
|
5月前
|
存储 Java 对象存储
Java虚拟机(JVM)中的栈(Stack)和堆(Heap)
在Java虚拟机(JVM)中,栈(Stack)和堆(Heap)是存储数据的两个关键区域。它们在内存管理中扮演着非常重要的角色,但各自的用途和特点有所不同。
56 0
|
5月前
|
存储 Java
JAVA程序运行问题之JVM 中的栈如何解决
JAVA程序运行问题之JVM 中的栈如何解决