数据结构之队列
队列:相当于排队买票,先来的人先买,后来的人只能排队,而且还不准插队。先进先出(first in first out,FIFO)
与栈相似,队列也只有两个类似的操作:入队(enqueue)和出队(dequeue)。
入队:是从队尾(tail)取出去。
出队:是从队头(head)取出去。
Java中常用操作:
// 用数组实现的队列
public class ArrayQueue {
// 数组:items,数组大小:n
private String[] items;
private int n = 0;
// head表示队头下标,tail表示队尾下标
private int head = 0;
private int tail = 0;
// 申请一个大小为capacity的数组
public ArrayQueue(int capacity) {
items = new String[capacity];
n = capacity;
}
// 入队
public boolean enqueue(String item) {
// 如果tail == n 表示队列已经满了
if (tail == n) return false;
items[tail] = item;
++tail;
return true;
}
// 出队
public String dequeue() {
// 如果head == tail 表示队列为空
if (head == tail) return null;
// 为了让其他语言的同学看的更加明确,把--操作放到单独一行来写了
String ret = items[head];
++head;
return ret;
}
}
循环队列:就是首尾相连的队列,长得像一个环一样。
循环队列的队空判断条件还是:
if(head == tail)
队满的判断条件则是
if((tail - 1)%n == head)
看下图就能明白,
实际上,队尾节点并没元素,但是占据了一个存储空间,
公式就是
(tail +1)%n == head
具体代码:
public class CircularQueue {
// 数组:items,数组大小:n
private String[] items;
private int n = 0;
// head表示队头下标,tail表示队尾下标
private int head = 0;
private int tail = 0;
// 申请一个大小为capacity的数组
public CircularQueue(int capacity) {
items = new String[capacity];
n = capacity;
}
// 入队
public boolean enqueue(String item) {
// 队列满了
if ((tail + 1) % n == head) return false;
items[tail] = item;
tail = (tail + 1) % n;
return true;
}
// 出队
public String dequeue() {
// 如果head == tail 表示队列为空
if (head == tail) return null;
String ret = items[head];
head = (head + 1) % n;
return ret;
}
}