首先我们来看一个队列在实际生活中的场景
我们在银行办理业务,是不是会看到这样一种场景,有一队人正整齐的排着队,在窗口前,等待办理业务,其实这就是队列在实际应用中的一个体现。

队列的特点

  • 队列的是Java数据结构中的一种,它的一个有序的 列表 ,可以使用数组或者链表来实现。
  • 遵循先进先出的原则,先存入的数据会先被取出来,后存入的数据会后取出来

队列的形式

  • 单向队列
  • 环形队列
数组模拟单向队列
  • 图解队列
  • maxsize :该队列中最大能存储的元素个数
  • front :队列的头部,它随着队列元素的输出而改变,初始值赋值为-1
  • rear: 队列的尾部,它随着队列的增加而改变,初始值赋值为-1
  • array[maxSize] : 存放数据的数组
  1. 向队列中存入数据,首先判断该队列是否已经存满,再存入队列中
  2. 向队列取出数据,首先判断该队列是否为空,在向队列取出元素
  3. 判断队列已满:rear == maxSize-1
  4. 判断队列为空:rear == front
代码实现
public class ArrayQueue {
	/*用于存储数据的数组*/
	private int[] array;

	/*队列头部*/
	private int front;

	/*队列的尾部*/
	private int rear;

	/*队列中最大存储个数*/
	private int maxSize;

	public ArrayQueue(maxSize) {
		this.array = new int[maxSize];
		this.maxSize = maxSize;
		this.front = -1;
		this.rear = -1;
	}
	
	/**
	* 判断该队列是否已满
	* @return true-已满 | false-不满
	*/
	private boolean isFull() {
		return 	rear == maxSize-1;
	}

	/**
	* 判断该队列是否为空
	* @return true-空 | false-否
	*/
	public boolean isEmpty() {
		return rear == front;
	}

	/**
	* 向队列中添加元素
	* @param 要添加的元素
	* @return true-成功 | false-失败
	*/
	public boolean addQueue(int num) {
		if (isFull) {
			System.out.print("队列已满无法添加");
			return false;
		}
		rear++;
		array[rear] = num;
		return true;
	}

	/**
	* 获取队列头部的元素
	* @return 元素值
	*/
	public int getQueue() {
		if (isEmpty()) {
			throw new RuntimeException("队列为空,不能取出队列!!!");
		}
		int num = array[front];
		front--;
		return num;
	}
	
	/**
	* 显示队列
	*/
	public void showQueue() {
		if (isEmpty()) {
			System.out.print("队列为空,不能打印队列");
			return;
		}
		for (int i = 0;i < this.array.length;i++) {
			System.out.print(array[i]);
		}
	}
}

代码写完了,我们这种方式存在一种问题,就是当我们取出数据后,front指针无法回到原来的位置,导致我们这个队列只能使用一次,所以我们引出了下面一种队列环形队列

数组实现环形队列
  • 图解环形队列
  • maxsize :该队列中最大能存储的元素个数
  • front :队列的头部,它随着队列元素的输出而改变,初始值赋值为0
  • rear: 队列的尾部,它随着队列的增加而改变,初始值赋值为0
  • array[maxSize] : 存放数据的数组
  1. 向队列中存入数据,首先判断该队列是否已经存满,再存入队列中
  2. 向队列取出数据,首先判断该队列是否为空,在向队列取出元素
  3. 判断队列已满:(rear+1)%maxSize == front
  4. 判断队列为空:rear == front
  5. 计算队列中有效数据(rear+maxSize-front)%maxSize
代码实现
public class ArrayQueue {
	/*用于存储数据的数组*/
	private int[] array;

	/*队列头部*/
	private int front;

	/*队列的尾部*/
	private int rear;

	/*队列中最大存储个数*/
	private int maxSize;

	public ArrayQueue(maxSize) {
		this.array = new int[maxSize];
		this.maxSize = maxSize;
		this.front = 0;
		this.rear = 0;
	}
	
	/**
	* 判断该队列是否已满
	* @return true-已满 | false-不满
	*/
	private boolean isFull() {
		return 	(rear+1)%maxSize == front;
	}

	/**
	* 判断该队列是否为空
	* @return true-空 | false-否
	*/
	public boolean isEmpty() {
		return rear == front;
	}

	/**
	* 向队列中添加元素
	* @param 要添加的元素
	* @return true-成功 | false-失败
	*/
	public boolean addQueue(int num) {
		if (isFull) {
			System.out.print("队列已满无法添加");
			return false;
		}
		array[rear] = num;
		rear = (rear+1)%maxSize;
		return true;
	}

	/**
	* 获取队列头部的元素
	* @return 元素值
	*/
	public int getQueue() {
		if (isEmpty()) {
			throw new RuntimeException("队列为空,不能取出队列!!!");
		}
		int num = array[front];
		front = (front+1)%maxSize;
		return num;
	}
	
	/**
	* 显示队列
	*/
	public void showQueue() {
		if (isEmpty()) {
			System.out.print("队列为空,不能打印队列");
			return;
		}
		for (int i = 0;i < (rear+maxSize-front)%maxSize;i++) {
			System.out.print(array[i]);
		}
	}
}

以上就是两种形式的用数组实现的队列。能力有限仅供参考!!!