队列(Java)
队列
队列是一种具有先进先出(FIFO)特点的集合了类型。
队列的应用性很广泛,这里就不一一赘述了。
与栈相似,队列也是一种操作受限的线性表,不同的是队列只允许在线性表的尾部进行插入操作,在线性表的头部进行删除操作,因此其特点为先进先出(FIFO)。
我们将能够进行插入操作的一端称为队尾(rear),能够进行删除操作的一端称为队头(front),队列中没有元素时,称为空队列。
我们先用图形来解释一下什么是“队列”吧。
包子铺早上刚刚开始营业。
有一名顾客走了进来。
店铺老板还没有将顾客1的包子准备好,又走进来了几个人,大家都自发地排起了队。
当1号顾客的包子包好之后,他就会离开,老板再为2号顾客准备。
之后再来的顾客将会依次排在队伍的最后面,当老板将包子打包好之后,队伍最前面的顾客就会离开队伍。
其实这个队伍就是一个队列,最前面的顾客就是队首元素,最后面的顾客就是队尾元素,同时我们也发现了队列的特点:先进先出(FIFO,First In First Out)。
顺序队列
建立顺序队列结构必须为其申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。
循环队列
在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1时超出了所分配的队列空间,就让它指向这片连续空间的起始位置,从而形成一个环,这就是循环队列。从MaxSize-1增1变到0,可用取余运算rear%MaxSize和front%MaxSize来实现。
顺序队列的实现(链表)
下面我们进行顺序队列的实现,由于循环队列与顺序队列实现方法基本相同,此处不再阐述。
顺序队列的API
队列(FIFO) | |
---|---|
Queue() | 创建一个空队 |
void enqueue(Item item) | 入队 |
Item dequeue() | 出队 |
boolean isEmpty() | 判断栈是否为空 |
int size() | 栈中元素数量 |
1.Queue()
public void Queue() { }
2.boolean isEmpty()
public boolean isEmpty() {
return first == null;
}
3.int size()
public int size() {
return N;
}
4.void enqueue(Item data)
public void enqueue(Item item) {
Node oldlast = last;
last = new Node();
last.item = item;
last.next = null;
if (isEmpty())
first = last;
else
oldlast = last;
N++;
}
5.Item dequeue()
public Item dequeue() {
Item item = first.item;
first = first.next;
if (isEmpty())
last = null;
N--;
return item;
}
完整代码如下
public class Queue<Item> {
private Node first;
private Node last;
private int N;
private class Node {
Item item;
Node next;
public Node() {//创建结点
}
public Node(Item data, Node next) {//创建指定数据以及指向的结点
this.data = data;
this.next = next;
}
}
public boolean isEmpty() {
return first == null;
}
public int size() {
return N;
}
public void enqueue(Item item) {
Node oldlast = last;//存储原来的队尾结点
last = new Node();//构建新的队尾结点
last.item = item;
last.next = null;
if (isEmpty())
//若队空 队首指向队尾结点
first = last;
else
//队尾结点指向旧队尾结点
oldlast = last;
N++;//队的大小变大
}
public Item dequeue() {
Item item = first.item;//出队
first = first.next;//更改队首结点指向
if (isEmpty())
//队空 队尾结点赋空
last = null;
N--;//队大小变小
return item;
}
}