225. 用队列实现栈

用两个队列实现栈

import java.util.LinkedList;
import java.util.Queue;

public class Algorithm {

    public static void main(String[] args) {

        MyStack myStack = new MyStack();

        for (int i = 0; i < 10; i++) {

            myStack.push(i);
            if (i % 2 == 0){
                myStack.pop();
            }
            System.out.println(myStack.top());
        }
    }
}

class MyStack{

    /**
     * 定义一个存放元素的队列
     */
    Queue<Integer> q1;

    /**
     * 存储栈顶元素
     */
    int topElement;

    public MyStack() {

        /**
         * Queue类是LinkedList类的父类
         */
        q1 = new LinkedList<>();

    }

    public void push(int x) {

        q1.add(x);
        topElement = x;
    }

    public int pop() {

        /**
         * 定义一个辅助队列,负责存储除栈顶元素以外的所有元素
         */
        Queue<Integer> q2 = new LinkedList<>();

        /**
         * 此处不能用for循环,因为队列的大小一直在改变
         */
        while (q1.size() > 1) {

            /**
             * 每次转移元素之前,保存一下当前的元素,最后一次保存的值就是此次pop后的新栈顶元素
             */
            topElement = q1.remove();
            q2.add(topElement);
        }

        int tem = q1.remove();
        q1 = q2;

        return tem;
    }

    public int top() {

        return topElement;
    }

    public boolean empty() {

        return q1.isEmpty();
    }
}

用一个队列实现栈

import java.util.LinkedList;
import java.util.Queue;

public class Algorithm {

    public static void main(String[] args) {

        MyStack myStack = new MyStack();

        for (int i = 0; i < 10; i++) {

            myStack.push(i);
            if (i % 2 == 0){
                myStack.pop();
            }
            System.out.println(myStack.top());
        }
    }
}

class MyStack{

    Queue<Integer> q;

    int topElement;

    public MyStack() {

        q = new LinkedList<>();

    }

    public void push(int x) {

        q.add(x);
        topElement = x;
    }

    /**
     * 使用一个队列时,栈顶元素位于队列末尾,当要取出时,将栈顶元素前面的所有元素出队再入队,平移到栈顶元素后面
     */
    public int pop() {

        for (int i = 0; i < q.size() - 1; i++) {

            /**
             * 此时新栈顶元素就是最后一次出队再入队的元素
             */
            topElement = q.remove();
            q.add(topElement);
        }

        return q.remove();
    }

    public int top() {

        return topElement;
    }

    public boolean empty() {

        return q.isEmpty();
    }
}

https://leetcode-cn.com/problems/implement-stack-using-queues/

posted @ 2021-10-14 19:36  振袖秋枫问红叶  阅读(20)  评论(0)    收藏  举报