剑指Offer #05 用两个栈实现队列

题目来源:牛客网-剑指Offer专题
题目地址:用两个栈实现队列

题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

题目解析

首先,我们需要知道一下基本知识:

栈(stack)是一种操作受限制的线性表,限定仅在表尾进行插入和删除操作的线性表,具有有“先进后出”的特性。
队列(queue)也是一种操作受限制的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,具有“先进先出”的特性。

题目就是想让我们用两个“后进先出”的数据结构,来实现一个“先进先出”的数据结构。我们不妨思考考一下,当我们在stack1中按顺序插入了序列[1, 2, 3],我们怎么利用另一个栈将其按“先进先出”顺序弹出呢?
1
显然,将类似于小学所学的负负得正,经过两次逆序操作,同样可以的到顺序(指“先进先出”)。于是,我们将stack1中的元素按弹出的顺序压入到stack2中,最后再将stack2中的元素按顺序弹出就可以了。
2
因为队列的Push和Pop操作的执行都是随机的,如果在某一刻stack2不是空的怎么办呢?(情况如下图所示)
3
这个时候,如果执行Push操作,我们可以直接将新元素压入stack1中;如果要执行Pop操作,可以将stack2中的栈顶元素弹出。

总结起来,我们可以得到如下算法:

  • 当执行Push操作时,直接将新元素压入stack1中
  • 当执行Pop操作时,判断stack2是否为空。若为空,则先将stack1的所有元素都放入stack2中;否则直接弹出stack2的栈顶元素
import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
    	//直接压入stack1中
        stack1.push(node);
    }
    
    public int pop() {
        if (stack2.isEmpty()) {
        	//如果stack2空了,就将stack1中的元素全部放入stack2中
            while (!stack1.isEmpty()) {
                int node = stack1.pop();
                stack2.push(node);
            }
        }
        //弹出stack2的栈顶元素
        return stack2.pop();
    }
}

如果本文对你有所帮助,要记得点赞哦~

发布了74 篇原创文章 · 获赞 149 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42292229/article/details/104485843