队列:
1.队列是一个有序列表,可以用数组或是链表来实现
2.遵循先入先出得原则。即:先存入队列得数据,要先取出;后存入的要后取出
使用数组来模拟队列:
(1)创建一个ArrayQueue类
//使用数组模拟队列
class ArrayQueue {private int maxsize; //表示数组最大容量private int first; //队列的首部private int tail; //队列的尾部private int[] arr; //该数组存放数据,模拟队列//创建队列的构造函数public ArrayQueue(int maxsize) {this.maxsize = maxsize;this.arr = new int[this.maxsize];this.first = -1; //指向队列首部的前一个位置this.tail = -1; //指向队列尾部,队列最后一个数据}//判断队列是否满了public boolean isFull() {return first == maxsize - 1;}//判断队列是否为空public boolean isEmpty() {return first == tail;}//在队列中加入数据public void addData(int x) {if (isFull()) {System.out.println("队列已满,不能加入数据");return;}tail++;arr[tail] = x;}//获取队列中数据public int getData() {if (isEmpty()) {throw new RuntimeException("队列为空,不能做取数据操作");}first++; //后移return arr[first];}//输出队列public void showQueue() {if (isEmpty()) {System.out.println("队列为空,没有数据");return;}for (int i = 0; i < arr.length; i++) {if (i <= first) {arr[i] = 0;}System.out.println("arr[" + i + "]=" + arr[i]);}}//显示队列的首部数据public int firstQueue() {if (isEmpty()) {throw new RuntimeException("队列为空,不能做查看数据操作");}return arr[first + 1];}}
(2)在QueueArray的main方法中来创建测试队列
public class QueueArray {public static void main(String[] args) {//测试,创建队列ArrayQueue queue = new ArrayQueue(3);Scanner scan = new Scanner(System.in);String key = ""; //用来接受用户输入boolean flag = true; //立一个flag//输出一个菜单System.out.println("add : 添加数据到队列");System.out.println("show : 显示队列");System.out.println("exit : 退出程序");System.out.println("get : 从队列取出数据");System.out.println("head : 查看首部数据");while (flag) {System.out.println("请输入您的指令:");key = scan.nextLine();switch (key) {case "add":System.out.println("输出一个数");int value = scan.nextInt();queue.addData(value);break;case "show":queue.showQueue();break;case "get":try {int data = queue.getData();System.out.println("取出的数据是:" + data);} catch (Exception e) {e.printStackTrace();}break;case "head":try {int data = queue.firstQueue();System.out.println("队列头的数据是:" + data);} catch (Exception e) {e.printStackTrace();}break;case "exit":flag = false;break;default:break;}}System.out.println("程序退出");}
}
(3)测试结果:
add : 添加数据到队列
show : 显示队列
exit : 退出程序
get : 从队列取出数据
head : 查看首部数据
请输入您的指令:
show
队列为空,没有数据
arr[0]=0
arr[1]=0
arr[2]=0请输入您的指令:
add
输出一个数
5
请输入您的指令:
add
输出一个数
6
请输入您的指令:
add
输出一个数
9
请输入您的指令:
show
arr[0]=5
arr[1]=6
arr[2]=9请输入您的指令:
get
取出的数据是:5
请输入您的指令:
show
arr[0]=0
arr[1]=6
arr[2]=9请输入您的指令:
get
取出的数据是:6
请输入您的指令:
show
arr[0]=0
arr[1]=0
arr[2]=9请输入您的指令:
get
取出的数据是:9
请输入您的指令:
show
队列为空,没有数据
arr[0]=0
arr[1]=0
arr[2]=0请输入您的指令:
(4)当再输入add指令存入数据会发现: 目前数组使用一次就不能用了,没有达到复用的效果
请输入您的指令:
add
输出一个数
5
队列已满,不能加入数据
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at data.queue.ArrayQueue.addData(QueueArray.java:94)at data.queue.QueueArray.main(QueueArray.java:25)
于是应该将这个数组改进成一个环形数组。