- 队列是一种特殊的线性表,只能在头尾两端进行操作.
- 队尾:只能从队尾添加元素,一般叫入队(enQueue).
- 队头:只能从队头移除元素,一般叫出队(deQueue)
- 先进先出
- 使用双向链表实现,只操作头尾,时间复杂度最低O(1),
代码实现:
public class Queue<E> {
private List<E> list = new LinkedList<>();
public int size(){
return list.size();
}
public boolean isEmpty(){
return list.isEmpty();
}
public void enQueue(E element){
list.add(element);
}
public E deQueue(){
E remove = list.remove(0);
return remove;
}
public E front(){
return list.get(0);
}
}
练习题:
题1: 用栈实现队列
/**
* https://leetcode-cn.com/problems/implement-queue-using-stacks/
* 用栈实现队列
*/
public class Queue232{
/**
* 用栈实现队列
* 准备2个栈:inStack outStack
* 入队时,push到inStack中
* 出队时 判断outStack是否为null
* 为null,就把inStack中的元素全部出栈 并且入栈到outStack
* 不为null时,就直接弹出outStack栈顶元素
*/
private Stack<Integer> inStack;
private Stack<Integer> outStack;
/** Initialize your data structure here. */
public Queue232() {
inStack = new Stack<>();
outStack = new Stack<>();
}
/** 入队 */
public void push(int x) {
inStack.push(x);
}
/** 出队 */
public int pop() {
checkOutStack();
return outStack.pop();
}
/** 获取头元素 */
public int peek() {
checkOutStack();
return outStack.peek();
}
/** 是否为null */
public boolean empty() {
return outStack.isEmpty()&&inStack.isEmpty();
}
private void checkOutStack(){
if (outStack.isEmpty()){
while (!inStack.isEmpty()){
outStack.push(inStack.pop());
}
}
}
}