队列的定义
先进先出的数据结构队列API
queue();构造函数
int size();队列容量
boolean isEmpty();队列是否为空
void enqueue(Item item);入队
Item dequeue(); 出队
Item peek(); 获取队头元素队列的实现
使用单链表实现,并支持迭代查询
package xwq.dt;
import java.util.Iterator;
import java.util.NoSuchElementException;
import xwq.util.StdIn;
import xwq.util.StdOut;
/**
* Compilation: javac Queue.java
* Execution: java Queue < input.txt
* Dependencies: StdIn.java StdOut.java
*
* 使用单链表实现的队列
*
* @author xwq
*
* @param <Item>
*/
public class Queue<Item> implements Iterable<Item> {
private Node<Item > first,last;//队首结点,队尾结点
private int N;//队列大小
private static class Node<Item> {
Item item;
Node<Item > next;
}
public Queue() {
first = null;
last = null;
}
public boolean isEmpty() {
return first == null;
}
public int size() {
return N;
}
/**
* 入队
* @param item
*/
void enqueue(Item item) {
Node<Item > node = new Node<Item>();
node.item = item;
node.next = null;
if(first == null) {
//队列为空
first = node;
last = node;
}
else {
//队列不为空
last.next = node;
last = node;
}
N++;
}
/**
* 出队
* @return
*/
Item dequeue() {
if(isEmpty())
throw new NoSuchElementException("队列为空");
Item item = first.item;
first = first.next;
if(isEmpty()) {
//如果删除结点后,队列为空,使队尾结点指向为空
last = null;
}
N--;
return item;
}
/**
* 获取队首元素
* @return
*/
Item peek() {
if(isEmpty())
throw new NoSuchElementException("队列为空");
return first.item;
}
@Override
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;
}
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Item next() {
// TODO Auto-generated method stub
if(!hasNext())
throw new NoSuchElementException();
Item item = current.item;
current = current.next;
return item;
}
@Override
public void remove() {
throw new UnsupportedOperationException("不支持删除操作!");
}
}
/*
* 测试 函数
*/
public static void main(String[] args) {
Queue<String > queue = new Queue<String>();
while(!StdIn.isEmpty()) {
String s = StdIn.readString();
if(!s.equals("-"))
queue.enqueue(s);
else if(!queue.isEmpty())
StdOut.print(queue.dequeue() + " ");
}
StdOut.println("size:"+queue.size());
}
}