package com.ywx.count;

/**
 * 循环队列操作:
 * 入队时:将新元素插入rear所指的位置的后一位。
 * 出队时:删去front所指的元素,然后将front加1并返回被删元素。
 * @author Vashon
 * date:20150402
 * @param <T>
 */
public class CirQueue<T> {
	T[] a;  //对象数组,队列最多存储a.length-1个对象
	//默认初始化大小
	private static final int DEFAULT_SIZE=10;
	int front;//首小标
	int rear;//尾下标
	public CirQueue(){
		this(DEFAULT_SIZE);
	}
	/**
	 * 初始化指定长度的队列
	 * @param size
	 */
	@SuppressWarnings("unchecked")
	public CirQueue(int size) {
		a=(T[]) new Object[size];
		front=0;
		rear=0;
	}
	/**
	 * 将一个对象追加到队列的尾部
	 * @param obj
	 * @return 队列满是返回false,否则返回true
	 */
	public boolean enqueue(T obj){
		if((rear+1)%a.length==front){
			return false;
		}else{
			a[rear]=obj;
			rear=(rear+1)%a.length;//取模后剩余的赋值给rear
			return true;
		}
	}
	/**
	 * 队列头部出栈
	 * 出栈要返回一个类型的实例内容
	 * @return
	 */
	public T dequeue(){
		if(rear==front){
			return null;
		}else{
			T obj=a[front];
			front=(front+1)%a.length;
			return obj;
		}
	}
	/**
	 * 队列的长度
	 * @return
	 */
	public int size(){
		if(rear>front){
			return rear-front;//return (rear-front)&(a.length-1)
		}else{
			return a.length-1;
		}
	}
	/**
	 * 判断是否为空
	 * @return
	 */
	public boolean isEmpty(){
		return rear==front;
	}
	public static void main(String args[]){
		CirQueue<String> queue=new CirQueue<String>(4);
		queue.enqueue("1");//入栈
		queue.enqueue("2");//入栈
		queue.enqueue("3");//入栈
		queue.enqueue("4");//入栈
		System.out.println("size="+queue.size());
		int size=queue.size();
		System.out.println("********出栈操作********");
		for(int i=0;i<size;i++){
			System.out.println(queue.dequeue()+" ");//出栈
		}
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。