【栈与队列】225. 用队列实现栈

原题链接:https://leetcode-cn.com/problems/implement-stack-using-queues/


【栈与队列】225. 用队列实现栈_第1张图片


队列是先进先出,栈是先进后出

但是两者共同点是,无论入队操作还是入栈操作,都是将元素进行尾插法进入的

无非出队操作的是第一个元素,出栈操作的是最后一个元素

栈的出栈操作无非就是获取队列的队尾元素

如果使用队列实现出栈操作,只能先将队尾元素之前的元素移出,最后将队尾元素移出就是出栈操作;

问题就在于出栈元素之前的元素怎么办呢?不能平白无故的就没了吧?

所以还得用另外一个队列存储这些元素

动画演示如下:

进栈操作:如果queue1和queue2都为空,默认入队queue1;之后谁不空入队谁,因为queue1和queue2是交替进行的,之后你就会看到

【栈与队列】225. 用队列实现栈_第2张图片

出栈操作:此时元素从左到右 [1,2,3] ,出栈的话我们需要出队元素3,所以先将元素1,2分别出队queue1并入队到queue2,再出队元素3即为出栈一个元素,此时queue1为空

【栈与队列】225. 用队列实现栈_第3张图片

那么按照这样的操作,接下来入栈的时候,是不是应该在queue2里入队元素?出栈的话是不是应该先移动queue2中队尾元素之前的元素进入queue1,然后queue2再出队队尾元素?所以就是queue1和queue2是交替操作的,哈哈。

这里我们的队列直接使用Java自带的LinkedList即可,入队操作为addLast(),出队操作为removeFirst()

class MyStack {
    private LinkedList queue1;
    private LinkedList queue2;

    public MyStack() {
        queue1=new LinkedList();
        queue2=new LinkedList();
    }

    public void push(int x) {
        if(queue1.isEmpty()&&queue2.isEmpty()){
            queue1.addLast(x);
        }else if(queue1.isEmpty()){
            queue2.addLast(x);
        }else{
            queue1.addLast(x);
        }
    }
    
    public int pop() {
        if(queue1.isEmpty()){
            int len=queue2.size();
            for(int i=0;i

 

 

你可能感兴趣的:(LeetCode讲解)