public class Stack<E> { // 使用之前编写的 ArrayList,而非 JDK 的 private List<E> list = new ArrayList<>(); public int size(){ return list.size(); } public boolean isEmpty(){ return list.isEmpty(); } public void push(E element){ list.add(element); } public E pop(){ return list.remove(list.size() - 1); } public E top(){ return list.get(list.size() - 1); }}
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12
public class Main { public static void main(String[] args) { Stack<Integer> stack = new Stack<>(); stack.push(11); stack.push(22); stack.push(33); stack.push(44); while (!stack.isEmpty()){ System.out.println(stack.pop()); } }}
public class Queue<E> { private List<E> list = new LinkedList<>(); public int size(){ return list.size(); } public boolean isEmpty(){ return list.isEmpty(); } public void clear(){ list.clear(); } public void enQueue(E element){ list.add(element); } public E deQueue(){ return list.remove(0); } public E front(){ return list.get(0); }}
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
public class Main { public static void main(String[] args) { Queue<Integer> queue = new Queue<>(); queue.enQueue(11); queue.enQueue(22); queue.enQueue(33); queue.enQueue(44); while (!queue.isEmpty()){ System.out.println(queue.deQueue()); } }}
2.3 JDK 源码
JDK 官方也提供了队列(Queue),只不过这是一个接口。
1
public interface Queue<E> extends Collection<E> { ... }
/** * @author 默烦 * @date 2020/7/2 */public class Deque<E> { private List<E> list = new LinkedList<>(); public int size(){ return list.size(); } public boolean isEmpty(){ return list.isEmpty(); } public void clear(){ list.clear(); } public void enQueueRear(E element){ list.add(element); } public E deQueueFront(){ return list.remove(0); } public void enQueueFront(E element){ list.add(0, element); } public E deQueueRear(){ return list.remove(list.size() - 1); } public E front(){ return list.get(0); } public E rear(){ return list.get(list.size() - 1); }}
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
public class Main { public static void main(String[] args) { Deque<Integer> deque = new Deque<>(); deque.enQueueFront(11); deque.enQueueFront(22); deque.enQueueRear(33); deque.enQueueRear(44); /* 尾 44 33 11 22 首*/ while (!deque.isEmpty()){ System.out.println(deque.deQueueRear()); } }}
4. 循环队列
4.1 基本含义
循环队列 (Circle Queue)底层是用数组实现的。
当需要删除一个元素(出队)时,就将队头指针指向的数据删除,之后使对头指针指向下一个元素。如:上图所示队列需要出队,那么删除元素 11,然后将 front 指向索引 1。
public static void main(String[] args) { int n = 19; int m = 10; // m > 0, n >= 0, n < 2m if (n >= m) { System.out.println(n - m); } else { System.out.println(n); } // m > 0, n >= 0, n < 2m // 上述运算等价于: System.out.println(n - (n >= m ? m : 0)); System.out.println(n % m);}
按照上述代码给出的思路,可以对 循环队列 的 int index(int index) 方法进行优化:
1 2 3 4 5
private int index(int index){ index += front; // 未考虑负数情况 循环队列中不会出现负数 return index - (index >= elements.length ? elements.length : 0);}
还可以对 循环双端队列 进行优化:
1 2 3 4 5 6 7
private int index(int index) { index += front; if (index < 0) { return index + elements.length; } return index - (index >= elements.length ? elements.length : 0);}
已知 n >= 0 ,m > 0,那么 n % m 等价于 n - (m > n ? 0 : m) 的前提条件是:n < 2m 。