美文网首页
华为二面:怎样用两个栈实现队列?

华为二面:怎样用两个栈实现队列?

作者: 程序员阿远 | 来源:发表于2022-03-29 16:43 被阅读0次

    1、题目
    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

    实例1:

    输入:

    [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]

    [[],[3],[],[]]

    输出:[null,null,3,-1]

    实例2:

    输入:

    [“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]

    [[],[],[5],[2],[],[]]

    输出:[null,-1,null,null,5,2]

    提示:

    1 <= values <= 10000

    最多会对 appendTail、deleteHead 进行 10000 次调用

    2、思路
    题目要求实现 加入队尾appendTail() 和 删除队首deleteHead() 两个函数,所以设计添加栈用于加入队尾操作,删除栈用于将元素删除队首元素。

    加入队尾 appendTail()函数: 将数字 val 直接压入添加栈。

    删除队首deleteHead()函数: 有以下两种情况。

    首先判断删除栈是否为空:

    如果删除栈中存在元素,直接可以返回删除栈的栈顶元素。

    如果删除栈中不存在元素,判断添加栈是否有元素

    如果添加有元素,将添加栈中的元素出栈压入删除栈中,弹出栈顶元素。

    如果添加无元素,说明该队列为空返回-1。

    废话少说~~~~~上代码!

    3、代码
    暴力解法:

    import java.util.Stack;
    class CQueue {
    Stack<Integer> stack1;
    Stack<Integer> stack2;
    public CQueue() {
    stack1 = new Stack<Integer>();
    stack2 = new Stack<Integer>();
    }

    public void appendTail(int value) {
    while(!stack1.isEmpty()){
    int num = stack1.pop().intValue();
    stack2.push(num);
    }
    stack2.push(value);
    }

    public int deleteHead() {
    while(!stack2.isEmpty()){
    int num = stack2.pop().intValue();
    stack1.push(num);
    }
    if(stack1.isEmpty())
    return -1;
    else
    return stack1.pop().intValue();
    }
    }
    /**

    • Your CQueue object will be instantiated and called as such:
    • CQueue obj = new CQueue();
    • obj.appendTail(value);
    • int param_2 = obj.deleteHead();
      */
      优化:

    直接将时间复杂度将为O(n)
    import java.util.Stack;
    class CQueue {
    Stack<Integer> stack1;
    Stack<Integer> stack2;
    public CQueue() {
    stack1 = new Stack<Integer>();//删除栈
    stack2 = new Stack<Integer>();//添加栈
    }

    public void appendTail(int value) {
    stack2.push(value);
    }

    public int deleteHead() {
    //判断当前删除栈是否为空
    if(stack1.isEmpty()){//如果为空
    while(!stack2.isEmpty()){//将添加栈的元素全部移动到删除栈
    stack1.push(stack2.pop());
    }
    //此时再一次判断删除栈是否为空
    if(stack1.isEmpty())
    return -1;
    else
    return stack1.pop();//弹出栈顶元素
    }else{//如果为不空
    return stack1.pop();//弹出栈顶元素
    }
    }
    }
    /**

    • Your CQueue object will be instantiated and called as such:
    • CQueue obj = new CQueue();
    • obj.appendTail(value);
    • int param_2 = obj.deleteHead();
      */
      总结
      该题目的最大难度在于题目给的输入输出让很多入门的新手很懵,不知道该题是要进行这样的代码编写。我们根据题目的提示可以清楚的发现只需要实现题目中所给的两个功能就可以很快的AC。

    希望对大家有帮助,多多支持阿宇,记得转发+关注哦

    相关文章

      网友评论

          本文标题:华为二面:怎样用两个栈实现队列?

          本文链接:https://www.haomeiwen.com/subject/vdeyjrtx.html