LeetCode【每日一题】-栈和队列1

文章目录

    • 用队列模拟栈
    • 用栈模拟队列

用队列模拟栈

题目链接

思路:只需要一个队列即可模拟栈操作
1、入栈时直接入队即可
2、出栈时要将除队尾元素的所有元素出队然后再入队,此时队首元素即为要出栈的元素,直接出队即可

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * 题目连接:https://leetcode.cn/problems/implement-stack-using-queues/
 * 思路:只需要一个队列即可模拟栈操作
 *      1、入栈时直接入队即可
 *      2、出栈时要将除队尾元素的所有元素出队然后再入队,此时队首元素即为要出栈的元素,直接出队即可
 */
public class MyStack {

    Deque<Integer> queue;
    public MyStack() {
        queue = new ArrayDeque<>();
    }

    /**
     * 入栈直接入队
     * @param x
     */
    public void push(int x) {
        queue.add(x);
    }

    /**
     * 出栈时要将除队尾元素的所有元素出队然后再入队,此时队首元素即为要出栈的元素,直接出队即可
     * @return
     */
    public int pop() {
        //记录当前队列元素个数
        int size = queue.size();
        //将除队尾元素出队然后入队
        while (size-- > 1) {
            queue.addLast(queue.poll());
        }
        //当前队首元素出队即为要出栈的元素
        return queue.poll();
    }

    /**
     * 读取栈头元素与出栈思路一样
     * @return
     */
    public int top() {
        return queue.peekLast();
    }

    /**
     * 判断是否为空
     * @return
     */
    public boolean empty() {
        return queue.isEmpty();
    }
}

用栈模拟队列

题目链接

思路:用俩个栈模拟一个队列
1、创建一个队列即为创建一个输入栈和输出栈
2、入队时直接push进输入栈
3、出队时要判断输入栈是否为空:空则直接弹出输出栈元素,不为空则要将输入栈元素全部弹到输入栈,再弹出输出栈元素

import java.util.Stack;

/**
 * 题目连接:https://leetcode.cn/problems/implement-queue-using-stacks/
 * 思路:用俩个栈模拟一个队列
 *       1、创建一个队列即为创建一个输入栈和输出栈
 *       2、入队时直接push进输入栈
 *       3、出队时要判断输入栈是否为空:空则直接弹出输出栈元素,不为空则要将输入栈元素全部弹到输入栈,再弹出输出栈元素
 */

public class MyQueue {
    //创建输入栈和输出栈
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    /**
     * 创建队列即为创建一个输入栈一个输出栈,因为用俩个栈模拟一个队列
     */
    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }

    /**
     * 入队操作直接入输入栈即可
     * @param x
     */
    public void push(int x) {
        stackIn.push(x);
    }

    /**
     * 出队操作首先要判断输出栈是否为空?
     *   1、不为空则直接弹出输出栈
     *   2、为空则要将输入栈元素全部弹出,再进入输出栈,然后再输出栈
     * @return
     */
    public int pop() {
        //当输入栈为空时
        if (stackIn.isEmpty()) {
            return stackOut.pop();
        } else {
            //输入栈不为空
            //将输入栈元素全部弹出到输出栈中
            while (!stackIn.isEmpty()) {
                stackOut.push(stackIn.pop());
            }
            return stackOut.pop();
        }
    }

    public int peek() {
        //当输入栈为空时
        if (stackIn.isEmpty()) {
            return stackOut.peek();
        } else {
            //输入栈不为空
            //将输入栈元素全部弹出到输出栈中
            while (!stackIn.isEmpty()) {
                stackOut.push(stackIn.pop());
            }
            return stackOut.peek();
        }
    }

    /**
     * 当俩个队列都为空时栈才为空
     * @return
     */
    public boolean empty() {
        if (stackIn.isEmpty() && stackOut.isEmpty()) {
            return true;
        } else {
            return false;
        }
    }
}

你可能感兴趣的:(leetcode,算法,java)