Java 栈和队列的相互转换详解

 更新时间:2022年02月14日 11:43:47   作者:Word码鸭  
栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解

栈和队列的本质是相同的,都只能在线性表的一端进行插入和删除。因此,栈和队列可以相互转换。

用栈实现队列—力扣232题

题目要求:仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作

使用双栈来实现队列,我们就可以让一个栈储存具体元素,另一个栈做辅助 

上图可以看到,新元素进栈时,要确保该栈为空。进入栈的元素按顺序存到辅助栈中,等新元素进入栈之后,再将辅助栈中的元素按顺序出到该栈中。这样操作之后,栈中元素存放的顺序就和队列的一样啦

代码实现:

 
//双栈模拟队列
public class MyQueue{
    //实际存储元素的栈
    private Stack<Integer> s1 = new Stack<>();
    //辅助栈
    private Stack<Integer> s2 = new Stack<>();
 
    public MyQueue() {
 
    }
 
    //将元素 x 推到队列的末尾
    public void push(int x) {
        if (s1.empty()){//栈为空,直接放入x
            s1.push(x);
        }else {
            //此时不为空
            //先把s1所有元素弹出放入s2
            while (!s1.empty()){
                s2.push(s1.pop());//s2放入的值就是s2弹出的值
                //以下两句和上一句相同
//                int val = s1.pop();
//                s2.push(val);
            }
            //将新元素直接放入s1,此时新元素就处在s1的栈顶
            s1.push(x);
            //再次将s2的所有值依次弹出放入s1
            while (!s2.empty()){
                s1.push(s2.pop());
            }
        }
 
    }
 
    //从队列的开头移除并返回元素
    public int pop() {
       return s1.pop();
    }
 
    //返回队列开头的元素
    public int peek() {
        return s1.peek();
    }
 
    //判断队列是否为空
    public boolean empty() {
        return s1.empty();
    }
}

用队列实现栈—力扣225题 

题目要求:仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作

1. 双队列实现栈

使用双队列实现栈, q1是存储元素的队列,保证q2添加元素之后永远为空队列(新元素直接入q2),保证新元素处在队首。这样的话,新元素入队之后,另外一个队列的元素依次出队然后入队,这样就实现了一个栈。

代码实现:

public class MyStack {
    //q1是存储元素的队列
    private Queue<Integer> q1 = new LinkedList<>();
    //q2是辅助队列
    //添加元素后保证q2永远为空
    private Queue<Integer> q2 = new LinkedList<>();
    public MyStack () {
 
    }
 
    //将元素 x 压入栈顶
    public void push(int x) {
        //新入队元素直接入q2,成为q2队首
        q2.offer(x);
        //将q1中的所有元素依次出队,入q2
        while (!q1.isEmpty()){
            q2.offer(q1.poll());
        }
 
        //q1为空,q2为存储元素的队列,互换引用指向
        //互换之后,q1任然是存储元素的队列,q2为空
        Queue<Integer> temp = q1;
        q1 = q2;
        q2 = temp;
    }
 
    // 移除并返回栈顶元素
    public int pop() {
        return q1.poll();
    }
 
    //返回栈顶元素
    public int top() {
        return q1.peek();
    }
 
    //判断栈是否为空
    public boolean empty() {
        return q1.isEmpty();
    }
}
 

2.一个队列实现栈

先将元素入队,再将之前的元素依次出队再入队即可!也就是说,保证新元素在队首

代码实现:

public class MyStack {
    private Queue<Integer> queue = new LinkedList<>();
    public MyStack() {
    }
 
    public void push(int x) {
        //记录之前元素的个数
        int size = queue.size();
        //将新元素入队
        queue.offer(x);
        //将之前的元素依次出队再入队,新元素就在队首位置
        for (int i = 0; i < size; i++) {
            queue.offer(queue.poll());
        }
 
    }
 
    public int pop() {
        return queue.poll();
    }
 
    public int top() {
        return queue.peek();
    }
 
    public boolean empty() {
        return queue.isEmpty();
    }
}

这几个例题实践目的是更加熟悉的掌握和了解栈和队列,实际应用中是不推荐的哦。

到此这篇关于Java 栈和队列的相互转换详解的文章就介绍到这了,更多相关Java 栈和队列 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现连连看算法

    Java实现连连看算法

    这篇文章主要为大家详细介绍了Java实现连连看算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 详解Java8与Runtime.getRuntime().availableProcessors()

    详解Java8与Runtime.getRuntime().availableProcessors()

    这篇文章主要介绍了详解Java8与Runtime.getRuntime().availableProcessors(),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • mybatis 自定义实现拦截器插件Interceptor示例

    mybatis 自定义实现拦截器插件Interceptor示例

    这篇文章主要介绍了mybatis 自定义实现拦截器插件Interceptor,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 玩转SpringBoot2快速整合拦截器的方法

    玩转SpringBoot2快速整合拦截器的方法

    这篇文章主要介绍了玩转SpringBoot2快速整合拦截器的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 浅析java双向冒泡排序算法

    浅析java双向冒泡排序算法

    这篇文章主要介绍了浅析java双向冒泡排序算法,并附上源码,需要的朋友可以参考下
    2015-02-02
  • SpringBoot HikariCP连接池详解

    SpringBoot HikariCP连接池详解

    这篇文章主要介绍了SpringBoot2.0 中 HikariCP 数据库连接池原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • mybatis中<choose>标签的用法说明

    mybatis中<choose>标签的用法说明

    这篇文章主要介绍了mybatis中<choose>标签的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 二叉搜索树实例练习

    二叉搜索树实例练习

    一棵二叉查找树是按二叉树结构来组织的。这样的树可以用链表结构表示,其中每一个结点都是一个对象
    2012-11-11
  • 分享令人目瞪口呆的 Java 代码技巧

    分享令人目瞪口呆的 Java 代码技巧

    这篇文章主要介绍了令人目瞪口呆的 Java 代码技巧,本文从写 Java 程序的小方面一直写到大方面,来阐述了如何才能写好 Java 程序,并告诉读者们如何才能提高自身的编码水平,需要的朋友可以参考下
    2022-05-05
  • SpringBoot如何在普通类加载Spring容器

    SpringBoot如何在普通类加载Spring容器

    这篇文章主要介绍了SpringBoot如何在普通类加载Spring容器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论