笔试必看-剑指Offer-09-用两个栈实现队列(简单 Java)

我们先看题目:

笔试必看-剑指Offer-09-用两个栈实现队列(简单 Java)_第1张图片

我们知道,对于栈,我们只能对栈顶进行操作,也就是说我们可以轻易实现入队操作,但出队操作我们实现不了,因为如果我们返回栈顶元素,相当于队列的队尾出队,然而题目要求的是我们进行队头出队。

题目给了我们思路:构造一个辅助栈!

我们先压栈五个元素 1 2 3 4 5 (5在栈顶)

然后出栈,用辅助栈入栈出栈的五个元素(有点绕0, 0)

这样辅助栈的五个元素对应是 5 4 3 2 1(1在栈顶)

这样的话,辅助栈出栈就会得到元素1,这样就相当于实现了队列出队的操作。

class CQueue {
    LinkedListA,B;   
    public CQueue() {
        A=new LinkedList<>();
        B=new LinkedList<>();
    }                        //构造两个栈
public void appendTail(int value) {
        A.add(value);               //模拟实现入队操作,这个简单,就是对栈A进行压栈。
    }
 public int deleteHead() {
        
        if(!B.isEmpty()) return B.removeLast();
        if(A.isEmpty()) return -1;
        while(!A.isEmpty()){
            B.add(A.removeLast());
        }
        return B.removeLast(); 
    }                             /*模拟实现出队操作,是本题的关键,其中有两个细节:
                                     第一:进行出队操作要首先判断辅助栈是否为空,如果不为空,说明
                                           出队不完全,要首先辅助栈出栈。
                                      第二:如若辅助栈已出队完全,判断栈A是否为空,如若栈A此时为空
                                           就按题目要求返回-1,这个好了理解,队伍根本没人,谈什
                                            么出队呢?
                                       第三: 当栈B为空,栈A不为空, 执行倒栈操作, 最后返回辅助栈
                                              栈顶元素即可。*/
}

如果对你有帮助,请点个免费的赞,谢谢。

题目链接:力扣icon-default.png?t=M276https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/

你可能感兴趣的:(面试,java)