package com.itjob.structure;

public class Queue {
	private int maxSize; // 表示队列的大小
	private int[] queArr; // 用数组来存放有队列的数据
	private int front; // 取数据的下标
	private int rear; // 存数据的下标
	private int nItems; // 记录存放的数据个数

	public Queue(int s) {
		maxSize = s;
		queArr = new int[maxSize];
		front = 0;
		rear = -1;
		nItems = 0;
	}

	public void insert(int j) { // 增加数据的方法
		if (isFull())
			return;
		// 如果下标到达数组顶部的话，让rear指向数组的第一个位置之前
		if (rear == maxSize - 1)
			rear = -1;
		queArr[++rear] = j; // increment rear and insert
		nItems++; // one more item
	}

	public int remove(){
		int temp = queArr[front++];
		// 如果下标到达数组顶部的话，让front指向数组的第一个位置
		if (front == maxSize)
			front = 0;
		nItems--;
		return temp;
	}

	public int peekFront(){
		// 只是返回最前面那个元素的值，并不删除	
		return queArr[front];
	}

	public boolean isEmpty() {
		return (nItems == 0);
	}

	public boolean isFull() {
		return (nItems == maxSize);
	}

	public int size() {
		return nItems;
	}

	public static void main(String[] args) {
		Queue theQueue = new Queue(4);
		theQueue.insert(10); // 插入4个数据
		theQueue.insert(20);
		theQueue.insert(30);
		theQueue.insert(40);
		theQueue.remove(); // 删除10
		theQueue.insert(50); // 再插入2个数据
		theQueue.insert(60); // 因为已满，所以该值未成功插入
		while (!theQueue.isEmpty())
		{
			System.out.println(theQueue.remove());
		}
	}
}
