1.循环队列
问题: 用数组实现一个循环队列,实现 poll 和 offer 方法
public class CycleArray { private int size; private int front; private int rear; private int[] arr; public CycleArray(int size) { this.size = 0; this.front = 0; this.rear = -1; arr = new int[size]; } public int poll() { if (size == 0) { throw new RuntimeException("队列为空"); } int i = arr[front]; decreaseFront(); size--; return i; } public boolean offer(Integer node) { if (size == arr.length) { return false; } increaseRear(); arr[rear] = node; size++; return true; } private void increaseRear() { if (rear == arr.length - 1) { rear = 0; } else { rear++; } } private void decreaseFront() { if (front == 0) { front = arr.length - 1; } else { front--; } } }
2.用栈结构实现队列
问题: 使用栈结构实现一个先进先出的队列结构
分析:
- 使用两个栈,一个为 push 栈,存放用户 push 进来的数据
- 另一个为 pop 栈,用来存放 pop 出去的数据
- push 栈导数据到 pop 栈时必须一次性全部完成
- pop 栈中有数据,不能从 push 栈中导数据
public static class TwoStacksQueue { public Stack<Integer> stackPush; public Stack<Integer> stackPop; public TwoStacksQueue() { stackPush = new Stack<Integer>(); stackPop = new Stack<Integer>(); } // push栈向pop栈倒入数据 private void pushToPop() { if (stackPop.empty()) { while (!stackPush.empty()) { stackPop.push(stackPush.pop()); } } } public void add(int pushInt) { stackPush.push(pushInt); pushToPop(); } public int poll() { if (stackPop.empty() && stackPush.empty()) { throw new RuntimeException("Queue is empty!"); } pushToPop(); return stackPop.pop(); } public int peek() { if (stackPop.empty() && stackPush.empty()) { throw new RuntimeException("Queue is empty!"); } pushToPop(); return stackPop.peek(); } }
3.用队列实现栈
问题: 用队列实现栈结构
分析:
- 队列是先进先出,栈是先进后出
- 可以使用两个队列来回倒
- 来回倒时,最后一个 node 就是栈的最上一个元素
public static class TwoQueueStack<T> { public Queue<T> queue; public Queue<T> help; public TwoQueueStack() { queue = new LinkedList<>(); help = new LinkedList<>(); } public void push(T value) { queue.offer(value); } public T poll() { while (queue.size() > 1) { help.offer(queue.poll()); } T ans = queue.poll(); Queue<T> tmp = queue; queue = help; help = tmp; return ans; } public T peek() { while (queue.size() > 1) { help.offer(queue.poll()); } T ans = queue.poll(); help.offer(ans); Queue<T> tmp = queue; queue = help; help = tmp; return ans; } public boolean isEmpty() { return queue.isEmpty(); } }
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于