题解 | #用两个栈实现队列#

用两个栈实现队列

https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6

思路

队列是先进先出的线性表,而对于栈来说,它是先进后出的线性表

我们使用两个栈来实现队列功能,即当入队元素时,将其存入其中一个栈(输入栈)中:

  • 当出队时,检查当前输出栈中是否有元素,如果没有,判断输入栈中是否存有元素,如果有将输入栈的值全部倒入输出栈中然后出栈栈顶元素。
  • 当入队需要检查输出栈中是否有元素,如果有,将输出栈中元素倒入输入栈
  • 本来还要做空队列无法出队的,但没有指定空队列应该返回什么值,所以就懒得做了

代码

import java.util.Stack;

public class Solution {
    /**
      * 输入栈
      */
    Stack<Integer> inputStack = new Stack<>();
    /**
     * 输出栈
     */
    Stack<Integer> outputStack = new Stack<>();

    /**
     * 入队方法
     *
     * @param node 入队元素
     * @apiNote
     * @since 2023/1/7 18:10
     */

    public void push(int node) {
        // 检查输出栈是否为空
        if (!outputStack.isEmpty()) {
            // 如果输出栈不为空,将输出栈中的数据倒回输入栈
            transfer(inputStack, outputStack);
        }
        // 将元素入栈
        inputStack.push(node);
    }

    /**
     * 出队方法
     *
     * @return int
     * @apiNote
     * @since 2023/1/7 18:11
     */

    public int pop() {
        // 检查输出栈是否为空
        if (outputStack.isEmpty()) {
            if (!inputStack.isEmpty()) {
                // 如果输出栈为空,输入栈不为空,将输入栈中的数据倒入输出栈
                transfer(outputStack, inputStack);
            }
        }
        return outputStack.pop();
    }

    /**
     * 栈转移方法
     *
     * @param mistressors            转移者
     * @param thoseWhoAreTransferred 被转移者
     * @apiNote 将一个栈的数据倒入另一个栈中,并将前者清空
     * @since 2023/1/7 18:27
     */
    public void transfer(Stack<Integer> mistressors,
                         Stack<Integer> thoseWhoAreTransferred) {
        while (!thoseWhoAreTransferred.isEmpty()) {
            mistressors.push(thoseWhoAreTransferred.pop());
        }
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务