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

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



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

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

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

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

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

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

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

动画演示如下:

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

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

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

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

class MyStack {
    private LinkedList<Integer> queue1;
    private LinkedList<Integer> queue2;

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

    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<len-1;i++){
                queue1.addLast(queue2.removeFirst());
            }
            return queue2.removeFirst();
        }else{
            int len=queue1.size();
            for(int i=0;i<len-1;i++){
                queue2.addLast(queue1.removeFirst());
            }
            return queue1.removeFirst();
        }
    }
    
    public int top() {
        if(queue1.isEmpty()){
            return queue2.getLast();
        }else{
            return queue1.getLast();
        }
    }
    
    public boolean empty() {
        return queue1.isEmpty()&&queue2.isEmpty();
    }
}
发布了88 篇原创文章 · 获赞 142 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u010189239/article/details/104811544
今日推荐