自己实现一个简单的队列

95 阅读1分钟

使用双向链表

在源码中的队列的实现就是使用的链表, 因此我们这里也简单的实现一下~

图解

双向链表

代码

/**
 * @Author XUE_957
 * @Date 2022/6/12 22:34
 * @Version 2022.1.1
 */
public class MyQueue1 {

    private static class ListNode {
        private int val;
        private ListNode prev;
        private ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }

    // 头节点
    private ListNode head;
    // 尾结点
    private ListNode tail;

    public MyQueue1() {

    }

    public void push(int x) {
        ListNode newNode = new ListNode(x);
        if (head == null) {
            head = newNode;
            tail = newNode;
            return;
        }
        // 这里使用尾插法
        tail.next = newNode;
        newNode.prev = tail;
        tail = newNode;
    }

    public int pop() {
        if (empty()) {
            return -1;
        }
        int val = head.val;
        head.prev = null;
        head = head.next;
        return val;
    }

    public int peek() {
        if (empty()) {
            return -1;
        }
        return head.val;
    }

    public boolean empty() {
        return head == null;
    }

    public static void main(String[] args) {
        MyQueue1 myQueue1 = new MyQueue1();
        myQueue1.push(1);
        myQueue1.pop();
        System.out.println(myQueue1.empty());
    }

}

使用两个栈

题目OJ: 使用栈实现队列

解题思路:

  • 每次将元素都 push 进 stack1 这个栈, pop 操作就弹出 stack2 的栈顶元素即可
  • stack2 作为一个辅助栈, 当 stack2 为空时就将 stack1 中所有的元素弹出并 push 到 stack2 中, 此时 stack2 的栈顶元素就是要出队的元素

图解

入队操作

出队操作

代码

/**
 * @Author XUE_957
 * @Date 2022/6/12 23:06
 * @Version 2022.1.1
 */
public class MyQueue2 {

    private Stack<Integer> stack1;
    private Stack<Integer> stack2;

    public MyQueue2() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }

    public void push(int x) {
        // 默认将元素入到 stack1
        stack1.push(x);
    }

    public int pop() {
        if (empty()) {
            return -1;
        }
        if (stack2.empty()) {
            int size = stack1.size();
            for (int i = 0; i < size; i++) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
     }

    public int peek() {
        if (empty()) {
            return -1;
        }
        if (stack2.empty()) {
            int size = stack1.size();
            for (int i = 0; i < size; i++) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.peek();
    }

    public boolean empty() {
        return stack1.isEmpty() && stack2.isEmpty();
    }

}