Java实现队列数据结构

数组实现

package queue;
/**
 * 这是一个Java实现的循环队列。
 * 
 * @author Stephen Huge
 *
 */
public class CirQueue<T> {
	/** 用来实现队列的数组 */
	private T[] array; 
	/** 队列头部元素的数组下标 */
	private int front;
	/** 队列尾部元素的数组下标-1,也就是说rear指向的是对尾元素之后的一个值为空的数组元素,其默认不存储元素*/
	private int rear;	
	public CirQueue() {
		this(16);
	} 
	/**
	 * 有参构造函数,产生一个定长的数组,这个长度减1是队列的最大长度
	 * @param len 队列的最大长度
	 */
	@SuppressWarnings("unchecked")
	public CirQueue(int len) {
		array = (T[]) (new Object[len]);
		front = 0;
		rear = 0;
	}
	/**
	 * 判断是否为空队列,如果front和rear相等返回true,不相等返回false
	 * @return 队列为空返回true,否则返回false
	 */
	public boolean isEmpty() {
		return front == rear;
	}
	/**
	 * 判断是否为满队列,如果为满返回true,否则返回false,队列满时下标rear指向的
	 * 数组元素不存储元素
	 * @return 队列为满返回true,否则返回false
	 */
	public boolean isFull() {
		return (rear + 1) % array.length == front;
	}
	/**
	 * 将一个对象追加到队列尾部,添加成功返回true,添加失败返回false
	 * @param element 要添加的元素
	 * @return 添加成功返回true,添加失败返回false
	 */
	public boolean enQueue(T element) {
		if(isFull()) {
			return false;
		}else{								
			array[rear] = element;
			rear = (rear + 1) % array.length;			
			return true;
		}		
	}
	/**
	 * 将队列头部的元素出队
	 * @return 出队的头部元素
	 */
	public T deQueue() {
		if(isEmpty()) {
			return null;
		}else{
			T temp = array[front];
			array[front] = null;
			front = (front + 1) % array.length;
			return temp;
		}		
	}
	/**
	 * 得到当前队列的长度
	 * @return 当前队列的长度
	 */
	public int size() {
		return (rear - front + array.length) % array.length;
	}
	public String toString() {		
		if(isEmpty()) {
			return "[]";
		}else{
			StringBuilder sb = new StringBuilder();
			sb.append("[");
			int fTemp = front;			
			//  遍历队列并打印其中元素
			for(; fTemp != rear; 
					fTemp = (fTemp + 1) % array.length) {				
				sb.append(array[fTemp]);
				if(fTemp != rear - 1) {
					sb.append(", ");	
				}
			}
			sb.append("]");
			return sb.toString();
		}				
	}
	
	public static void main(String[] args) {
		CirQueue<String> queue = new CirQueue<String>(5);		
		queue.enQueue("aaa");		
		queue.enQueue("bbb");
		queue.enQueue("ccc");
		queue.enQueue("ddd");
		System.out.println(queue.isFull());
		queue.enQueue("eee");
		System.out.println(queue.size());						
		queue.deQueue();					
		System.out.println(queue.toString());
	}
}

运行结果

true
4
[bbb, ccc, ddd]

链表实现

package queue;
/**
 * 这是一个Java实现的链队列。
 * @author Stephen Huge
 * 
 */
public class LinkQueue<T> {
	/**
	 * 私有内部类Node
	 */
	private class Node{
		public T data;
		public Node next;
		public Node() {	}
		public 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++;
	}
	/**
	 * 将一个对象追加到队列尾部,添加成功返回true,添加失败返回false
	 * @param element 要添加的元素
	 * @return 添加成功返回true,添加失败返回false
	 */
	public boolean enQueue(T element) {
		if(isEmpty()) {
			front = new Node(element, null);
			rear = front;			
		}else{
			Node newNode = new Node(element, null);
			rear.next = newNode;
			rear = newNode;
		}
		size++;
		return true;
	}
	/**
	 * 将队列头部的元素出队
	 * @return 出队的头部元素
	 */
	public T deQueue() {
		if(isEmpty()) {
			return null;
		}else{
			Node temp = front;
			front = front.next;
			temp.next = null;
			size--;
			return temp.data;			
		}		
	}
	/**
	 * 判断是否为空队列,如果front和rear相等返回true,不相等返回false
	 * @return 队列为空返回true,否则返回false
	 */
	public boolean isEmpty() {
		return front == null;
	}
	/**
	 * 得到当前队列的长度
	 * @return 当前队列的长度
	 */
	public int size() {
		return size;
	}
	public String toString() {
		if(isEmpty()) {
			return "[]";
		}else{
			StringBuilder sb = new StringBuilder();
			sb.append("[");
			for(Node current = front; current != null; current = current.next){
				sb.append(current.data.toString());
				if(current != rear) {
					sb.append(", ");
				}
			}
			sb.append("]");
			return sb.toString();
		}
	}
	
	public static void main(String[] args) {
		LinkQueue<String> lq = new LinkQueue<String>();
		lq.enQueue("aaa");
		System.out.println(lq.toString());
		lq.enQueue("bbb");
		System.out.println(lq.toString());
		lq.enQueue("ccc");
		System.out.println(lq.toString());
		System.out.println(lq.size());
		lq.deQueue();
		System.out.println(lq.toString());
		System.out.println(lq.size());
	}
}


运行结果

[aaa]
[aaa, bbb]
[aaa, bbb, ccc]
3
[bbb, ccc]
2




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值