【栈】--- 用两个栈实现队列

题目

用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。


分析

  • 栈特点:先进后出
  • 队列特点:先进先出

思路

in 栈用来处理入栈(push)操作,out 栈用来处理出栈(pop)操作。一个元素进入 in 栈之后,出栈的顺序被反转。当元素要出栈时,需要先进入 out 栈,此时元素出栈顺序再一次被反转,因此出栈顺序就和最开始入栈顺序是相同的,先进入的元素先退出,这就是队列的顺序。

正序进(A)->倒序出(A)->倒序进(B)->正序出(B)


在这里插入图片描述

源码

package org.example.stack;

import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 * 用两个栈实现队列
 * @author Abner G
 * @date 2022/3/17 21:14
 */
public class practiceStack01 {


    /**
     *题目
     *用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。
     * https://github.com/CyC2018/CS-Notes/blob/master/notes/9.%20%E7%94%A8%E4%B8%A4%E4%B8%AA%E6%A0%88%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97.md
     *
     */
    public static void main(String[] args) {
        final MyQueue myQueue = new MyQueue();
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
        for (Integer integer : integers) {
            myQueue.push(integer);
        }
        for (Integer integer : integers) {
            System.out.println(myQueue.pop());
        }


    }


    /**
     * 解题思路:
     * 题目关键点:栈,队列
     * 栈特点:先进后出
     * 队列特点:先进先出
     * in 栈用来处理入栈(push)操作,
     * out 栈用来处理出栈(pop)操作。
     * 一个元素进入 in 栈之后,出栈的顺序被反转。
     * 当元素要出栈时,需要先进入 out 栈,
     * 此时元素出栈顺序再一次被反转,
     * 因此出栈顺序就和最开始入栈顺序是相同的,
     * 先进入的元素先退出,这就是队列的顺序。
     *
     * 正序进(A)->倒序出(A)->倒序进(B)->正序出(B)
     */


}


class MyQueue{


    private Stack<Integer> in = new Stack<Integer>();

    private Stack<Integer> out = new Stack<Integer>();


    public MyQueue() {
    }

    public void push(int node) {
        in.push(node);
    }

    public Integer pop(){
        if (out.isEmpty()){
            // 关键点
            while (!in.isEmpty()){
                out.push(in.pop());
            }
        }
        if (out.isEmpty()){
            return null;
        }
        return out.pop();
    }



}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abner G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值