使用双向链表
在源码中的队列的实现就是使用的链表, 因此我们这里也简单的实现一下~
图解
代码
/**
* @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();
}
}