队列的链式实现(java)

单链表实现队列,这里采用带头结点的单链表结构。根据单链表的特点,选择链表的头部作为队首,链表的尾部作为队尾。除了链表头结点需要通过一个引用来指向之外,还需要一个对链表尾结点的引用,以方便队列的入队操作的实现。为此一共设置了两个指针,一个队首指针和一个队尾指针,队首指针指向队首元素的前一个结点,即始终指向链表空的头结点,队尾指针指向队列当前队尾元素所在的结点。当队列为空时,队首指针与队尾指针均指向空的头结点。

public class Queue<T> implements QueueInterface<T> {

private Node<T> front;
private Node<T> rear;
private int size; //队列的大小

public Queue() {
front=new Node<T>();
rear=front;
size = 0;
}

//返回队列的大小
public int getSize() {
return size;
}

//判断队列是否为空
public boolean isEmpty() {
return size==0;
}

//数据元素e入队
public void offer(T t) {
Node<T> q = new Node<T>(t,null);
rear.setNext(q);
rear=q;
size++;
}

//队首元素出队
public T poll() throws QueueEmptyException {
if (size<1)
throw new QueueEmptyException("错误,队列为空。");
Node<T> t = front.getNext();
front.setNext(t.getNext());
size--;
if(size<1){
rear=front;
size=0;
}
return t.getData();

}

//取队首元素
public T peek() throws QueueEmptyException {
if (size<1)
throw new QueueEmptyException("错误,队列为空。");
return front.getNext().getData();
}
//测试
public static void main(String[] args) {
Queue<String> queue = new Queue<String>();
queue.offer("Hello");
queue.offer("World!");
queue.offer("你好!");
System.out.println(queue.getSize());
while(!queue.isEmpty()){
System.out.print(queue.poll());
}
System.out.println();
System.out.println(queue.getSize());
}


}


interface QueueInterface<T> {
//返回队列的大小
public int getSize();

//判断队列是否为空
public boolean isEmpty();

//数据元素t入队
public void offer(T t);

//栈顶元素出队
public T poll() throws QueueEmptyException;

//取队首元素
public T peek() throws QueueEmptyException;
}

class Node< T> {
private T data;
private Node< T> next;

public Node() {
this(null,null);
}

public Node(T data, Node< T> next) {
this.data = data;
this.next = next;
}
public T getData(){
return data;
}
public void setData(T data){
this.data=data;
}

public Node<T> getNext(){
return this.next;
}

public void setNext(Node<T> next){
this.next=next;
}
}


//队列为空时出栈或取栈顶元素抛出此异常
class QueueEmptyException extends RuntimeException{

public QueueEmptyException(String err) {
super(err);
}
}



在java jdk中有java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用
element()或者peek()方法。
值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
下载代码:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值