队列的不同存储结构及JAVA实现

队列:队列是指允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为对头。

             队列中的元素除了具有线性关系外,还具有先进先出的特性。

1.队列的顺序存储结构及实现——循环队列

 将存储队列的数组看成是头尾相接的循环结构,即允许队列直接从数组中下标最大的位置延续到下标最小的位置。这样通过取模操作很容易实现,队列的这种头尾相接的顺序存储结构称为循环对列。      需要设置队头,对尾指针,并且约定:队头指针front指向队头元素的前一个位置,队尾指针rear指向队尾元素。

 

package data.queue;
/**
 * 实现循环队列
 * @author zhouhai
 *
 */
public class QueueArray<T> {
Object [] a;//对象数组
int capacity;//数组的长度
int front;//队首下标
int rear;//队尾下表
/**
 * 默认数组长度为10,构造空队列
 */
public QueueArray(){
	capacity=10;
	front=0;
	front=0;
	a=new Object[capacity];
	
}
/**
 * 以一个初始元素来构造循环队列
 */
public QueueArray(T element){
  this();
  a[0]=capacity;
  rear++;
}
/**
 *以一个初始化元素来构造指定长度的循环队列 
 */
public QueueArray(T element,int size){	
	capacity=size;
	a=new Object[capacity];
	a[0]=element;
	rear++;
}
/**
 * 返回队列长度
 */
public int length(){
	if(isEmpty()){
		return 0;
	}
	return rear>front?rear-front:capacity-(front-rear);
}
/**
 * 入队操作
 */
public void Enqueue(T element){
	if(rear==front&&a[rear]!=null) {
		throw new IndexOutOfBoundsException("队列已满");
	}
	a[rear++]=element;
	rear=rear==capacity?0:rear;//如果rear到头,那么就转头
}
/**
 * 出队操作
 */
public T DeQueue(){
	if(isEmpty()){
		throw new IndexOutOfBoundsException("空对列");
	}
	T value=(T) a[front];
	a[front++]=null;
	front=front==capacity?0:front;
	return value;
}
/**
 * 判断队列是否为空
 */
public boolean isEmpty(){
	return rear==front&&a[rear]==null;
}
}


2.队列的链接存储结构及实现
  队列的链接存储结构——链队列
  链队列是在单链的基础上做了简单的修改,为了使空队列和非空队列的操作一致,链队列也加上了头结点,根据队列的先进先出特性,设置头指针指向链队列的头结点,尾指针指向终端结点。
  
package data.queue;
/**
 * 
 * @author zhouhai

 */
public class LinkQueue<T> {
  private class Node{
	  private T data;//数据域
	  private Node next;//指向下一结点的引用
	  Node(){
		  
	  }
	  Node(T data,Node next){
		  this.data=data;
		  this.next=next;
	  }
  }
  private Node front;//保存队列的头结点
  private Node rear; //保存队列的尾结点
  private int size;  //队列中所含的结点树
  
  public LinkQueue(){
	  front=null;
	  rear=null;
  }
  /**
   * 以指定元素来创建链队列,该队列只有一个结点
   * @param element
   */
  public  LinkQueue(T element){
	  front=new Node(element,null);
	  rear=front;
	  size++;
  }
  /**
   * 返回对垒的长度
   *@Title: length     
   *@throws
   */
  public int length(){
	  return size;
  }
  /**
   * 将新元素加入队列
   */
  public void EnQueue(T element){
	  if(front==null){
		 front=new Node(element,null);
		 rear=front;
	  }else{
	    Node node=new Node();
	    node.data=element;
	    rear.next=node;//让原来的尾结点的next指向node
	    rear=node;//node设为新的尾结点
	  }
	  size++;
  }
  /**
   * 头结点出队列
   */
  public  T DeQueue(T element){
	  if(front==null){
		  throw new ArrayIndexOutOfBoundsException("空栈队列");
	  }else{
		  Node node=front;
		  front=front.next;
		  node.next=null;
		  size--;
		  return node.data;
	  }
  }
  /**
   * 清空栈
   */
  public void clear(){
	  front=rear=null;
	  size=0;
  }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值