0. 形象记忆:
一年月初就是过年季节,而第一个数据结构选择是队列,过年季节,你就要春运买票,虽然现在可以网络买票,但是以前我们可都是去火车站排队买票的,排队买票就是先进先出的
队列:特点,先进先出,比较基础的数据结构
概念:只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表;进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列);队列具有先进先出(FIFO)的特性
1. 代码思路
1.1、构造方法
//第一位
private Node<Item> first;
//最后一位
private Node<Item> last;
// 统计队列总数
private int n;
public Queue() {
first = null;
last = null;
n = 0;
}
1.2、入队
public void enqueue(Item item) {
Node<Item> oldlast = last;
last = new Node<Item>();
last.item = item;
last.next = null;
if (isEmpty()) first = last;
else oldlast.next = last;
n++;
}
- 先把last保存,然后生成一个数据结构作为新的最后一位,他的下一位是未知,所以是空的,
- 判断如果队列是空的(第一位是空)那新的最后一位同时也是第一位,不然老的最后一位下一位就是新的最后的一位
- 统计数+1
1.3、出队
public Item dequeue() {
if (isEmpty()) throw new NoSuchElementException("Queue underflow");
Item item = first.item;
first = first.next;
n--;
if (isEmpty()) last = null; // to avoid loitering
return item;
}
- 判断是否为空,直接抛错
- 第一位出对,取出第一位的下一位设置为第一位
- 统计数-1
- 判断是否为空,如果为空最后一位也是空,
- 返回item
3. 全部代码
public class Queue<Item> implements Iterable<Item> {
private Node<Item> first;
private Node<Item> last;
private int n;
private static class Node<Item> {
private Item item;
private Node<Item> next;
}
/**
* 初始化一个空队列.
*/
public Queue() {
first = null;
last = null;
n = 0;
}
/**
* 是否为空
* @return
*/
public boolean isEmpty() {
return first == null;
}
/**
* 返回队列数目
* @return
*/
public int size() {
return n;
}
/**
* 返回队列First,但是不溢出
* @return
*/
public Item peek() {
if (isEmpty()) throw new NoSuchElementException("Queue underflow");
return first.item;
}
/**
* 入队
* @param item
*/
public void enqueue(Item item) {
Node<Item> oldlast = last;
last = new Node<Item>();
last.item = item;
last.next = null;
if (isEmpty()) first = last;
else oldlast.next = last;
n++;
}
/**
* 出列
* @return
*/
public Item dequeue() {
if (isEmpty()) throw new NoSuchElementException("Queue underflow");
Item item = first.item;
first = first.next;
n--;
if (isEmpty()) last = null; // to avoid loitering
return item;
}
public String toString() {
StringBuilder s = new StringBuilder();
for (Item item : this) {
s.append(item);
s.append(' ');
}
return s.toString();
}
public Iterator<Item> iterator() {
return new ListIterator<Item>(first);
}
private class ListIterator<Item> implements Iterator<Item> {
private Node<Item> current;
public ListIterator(Node<Item> first) {
current = first;
}
public boolean hasNext() { return current != null; }
public void remove() { throw new UnsupportedOperationException(); }
public Item next() {
if (!hasNext()) throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
}
}