队列的实现
数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| public class Main{ int[] array; int Rear; int Front; int maxSize; public void createQueue(int maxSize){ this.maxSize = maxSize; array = new int[maxSize]; } public void reSize(){ int[] arrayBig = new int[maxSize*2]; System.arraycopy(array,0,arrayBig,array.length); array = arrayBig; }
}
|
链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class Main{ Node front = null; Node rear = null; int size = 0;
class Node{ Node next; int val; public Node(int val){ this.val = val; } } }
|
- 正常情况
- 出队:
front = front.next - 入队:
rear.next = node; rear = rear.next
- 特殊情况
- 队列为空时,
front = rear = null。此时入队操作是让 front = rear = node - 队列只有一个元素时,
front = rear。此时出队操作是让 front = rear = null
API实现队列
队列类
1
| Queue<Integer> q = new LinkedList<>();
|
入队
出队
得到队内第一个元素
1
| Integer front = q.peek();
|
得到队的大小
队是否为空
双端队列
顾名思义,既可以在头进出,也可以在尾进出的队列称为双端队列。
注意:ArrayDeque的效率是高于stack和LinkedList的,但ArrayDeque中不能放null,否则会报空指针异常,这种情况只能用LinkedList
- 双端队列Deque既有先入先出的特性又有先入后出的特性,既可以实现队列又可以实现栈
- Deque接口继承于Queue
- Deque实现了ArrayDeque和LinkedList
- ArrayDeque:数组实现的双端队列,作为队列时效率高
- LinkedList:链表实现的双端队列,作为栈时效率高
实现类
1 2
| Deque<Integer> stack = new LinkedList<>(); Deque<Integer> queue = new ArrayDeque<>();
|
栈API
- pop(): 弹出栈中元素,也就是返回并移除队头元素,等价于removeFirst(),如果队列无元素,则发生NoSuchElementException异常
- push(): 向栈中压入元素,也就是向队头增加元素,等价于addFirst(),如果元素为null,则发生NPE,如果栈空间受到限制,则发生IllegalStateException异常
插入API
- addFirst(): 向队头插入元素,如果元素为空,则发生NPE(空指针异常)
- addLast(): 向队尾插入元素,如果为空,则发生NPE
- offerFirst(): 向队头插入元素,如果插入成功返回true,否则返回false
- offerLast(): 向队尾插入元素,如果插入成功返回true,否则返回false
删除API
- removeFirst(): 返回并移除队头元素,如果该元素是null,则发生NoSuchElementException异常
- removeLast(): 返回并移除队尾元素,如果该元素是null,则发生NoSuchElementException异常
- pollFirst(): 返回并移除队头元素,如果队列无元素,则返回null
- pollLast(): 返回并移除队尾元素,如果队列无元素,则返回null
获取API
- getFirst(): 获取队头元素但不移除,如果队列无元素,则发生NoSuchElementException
- getLast(): 获取队尾元素但不移除,如果队列无元素,则发生NoSuchElementException
- peekFirst(): 获取队头元素但不移除,如果队列无元素,则返回null
- peekLast(): 获取队尾元素但不移除,如果队列无元素,则返回null