数据结构——队列——循环队列

package jxau.lyx.queue;

/**
 * 
 * @author liyixiang
 * @2014-9-20
 * @DataStrutureType: 队列之循环队列
 * @TODO:
 * 		基本队列结构:
 * 		队列是先进先出 那么队头为出口 队尾为入口
 * 		以前队列的理解是一个元素出队列后,后面元素自动前进(例如排队)
 * 现在发现是队头指针和队尾指针的移动!
 * 		循环队列的含义是:
 * 使用环绕式处理 让队头队尾指针绕回到数组开始的位置(解决假溢出)
 * 		
 * 		假溢出:
 * 		由于队尾指针rear的值和队头指针front的值不能由所定义存储空间的最大值自动转
 * 为所定义存储空间的最小值而产生
 * 
 * 		注意:
 * 		当队列满时,front与rear指针取一定的位置,但是当队列为空时,也可能呈现相同
 * 的位置关系,于是在同一时间,队列似乎是满的,也可能是空的。
 * 		解决:
 * 		1.让数组容量比队列数据项个数的最大值还要大一。
 * 			rear+1 = front
 * 		2.设置一个标志位
 * 			入队tag++ 出队tag--
 * 		3.设置一个计数器
 * 			count == 0(类似于代码中的nItems)  不仅可以计数,还具有标志位的功能。
 */
public class Queue {

	private int maxSize;                      //队列最大空间
	private Object[] queueArray;            //队列空间
	private int front;                          //队头索引
	private int rear;                           //队尾索引
	private int nItems;                        //队中含有的元素个数
	
	/**
	 * 初始化
	 * @param s:队空间大小
	 */
	public Queue(int s){
		maxSize = s;
		queueArray = new Object[maxSize];
		front = 0;
		rear = -1;
		nItems = 0;
	}
	
	/**
	 * 
	 *@liyixiang
	 *@2014-9-20
	 *@param:obj 入队元素
	 *@return:void
	 *@TODO:
	 *		入队:
	 *方法运行的前提条件是队列不满,通常应该先调用isFull方法判断队列是否为满
	 *更通常的做法是在insert方法中就加入检查队列是否满的判定,如果出现向已满
	 *队列里插入数据项的情况就抛出异常
	 *		循环队列解决基本队列的假溢出
	 */
	public void insert(Object obj){
		if(rear == maxSize-1){                //队尾索引已达最大空间
			rear = -1;							  //队尾指针回绕
		}
		
		queueArray[++rear] = obj;            //队尾
		nItems++;
	}
	
	/**
	 * 
	 *@liyixiang
	 *@2014-9-21
	 *@param
	 *@return:Object:移除元素
	 *@TODO:
	 *		出队
	 *		运行的前提条件是队列不空,在调用这个方法之前应该先调用isEmpty方法确保
	 *队列不空,或者在remove方法里加入这种出错检查机制
	 */
	public Object remove(){
		
		Object temp = queueArray[front++];       //移除队头元素
		if(front == maxSize){                        //队头指针达最大空间
			front = 0;                                 //将队头置0
		}
		
		nItems--;                                     
		return temp;
	}
						
	/**
	 * 
	 *@liyixiang
	 *@2014-9-21
	 *@param
	 *@return:Object
	 *@TODO:
	 *		获取队头元素
	 */
	public Object peekFront(){
		 return queueArray[front];
	}
	
	/**
	 * 
	 *@liyixiang
	 *@2014-9-21
	 *@param
	 *@return:boolean
	 *@TODO:
	 *		判断队列是否为空
	 */
	public boolean isEmpty(){
		return (nItems == 0);
	}
	
	/**
	 * 
	 *@liyixiang
	 *@2014-9-21
	 *@param
	 *@return:boolean
	 *@TODO:
	 *		判断队列是否为满
	 *
	 */
	public boolean isFull(){
		return nItems == maxSize;
	}
	
	/**
	 * 
	 *@liyixiang
	 *@2014-9-21
	 *@param
	 *@return:int
	 *@TODO:
	 *		获取当前队列元素个数
	 */
	public int size(){
		return nItems;
	}
}	


你可能感兴趣的:(数据结构——队列——循环队列)