数组模拟队列
我们先来回顾下什么是队列数据结构:
- 队列是一种先进先出,后进后出的线性表
- 加数据是在队列的尾部加,取数据是在队列的头部取
- 队列只允许在后端(称为rear )进行插入操作,在前端(称为front )进行删除操作
- 队列满的情况:尾结点read 等于 MaxSize-1
分析:
定义数组类 ArrayQueue:
private int maxSize;//数组的最大容量 private int front;//头结点 private int read;//尾结点 private int[] arr;//创建数组用于存放数据,模拟队列
无参构造初始化队列:
/**
* 构造方法
* @param arrMaxSize 队列能够拥有的最大容量
*/
public ArrayQueue(int arrMaxSize){
maxSize = arrMaxSize;//传入数据表示队列能够拥有的最大容量
arr = new int[maxSize];//初始化数组
front = -1;//指向队列头结点的前一个位置
read = -1;//指向的是队列的尾结点(就是队列的最后一个数据)
}
队列满:
/**
* 判断队列是否满了,判断队列是否满的条件是:尾结点==队列最大容量-1
* @return
*/
public boolean isFull(){
return read == maxSize-1;
}
队列空:
/**
* 判断队列是否为空
* @return
*/
public boolean isAir(){
return front == read;
}
添加数据:
/**
* 添加数据到队列
* @param data:添加的数据
*/
public void add(int data){
//先判断队列是否满
if (isFull()){
System.out.println("队列已满,不能加入数据!");
return;
}
read++;//先让尾结点后移
arr[read] = data;
}
出队列(取数据):
/**
* 获取队列的数据,出队列
* @return
*/
public int get(){
//先判断队列是否为空
if (isAir()){
//通过抛出异常来解决
throw new RuntimeException("队列空,不能取数据!");
}
front++;//让头结点后移一位
return arr[front];
}
打印队列:
/**
* 打印数据,就是遍历arr数组
*/
public void listQueue(){
//判断队列是否为空
if (isAir()){
System.out.println("队列为空,没有数据!");
}
for (int i=0;i<arr.length;i++){
System.out.println("arr["+i+"]="+arr[i]);
}
}
显示队头数据:
/**
* 显示队列的头数据
*/
public int headQueue(){
if (isAir()){
throw new RuntimeException("队列是空的没有数据");
}
return arr[front+1];//+1是因为头结点指向的是队列的前一个数据
}
完整代码:
public class Test02_数组模拟队列 { public static void main(String[] args) { ArrayQueue queue = new ArrayQueue(3); char value = ' '; Scanner s = new Scanner(System.in); boolean loop = true; while (loop){ System.out.println("=================================="); System.out.println("s(show):显示队列"); System.out.println("e(exit):退出程序" ); System.out.println("a(add):添加数据到队列"); System.out.println("g(get):从队列取出数据"); System.out.println("h(head):查看队列头的数据"); System.out.println("=================================="); //接受用户输入的一个字符 System.out.print("请输入指令:"); value = s.next().charAt(0); switch (value){ case 's'://显示队列 queue.listQueue(); break; case 'g'://取数据 System.out.println("取出的数据是:"+queue.get()); break; case 'a'://添加数据 System.out.print("请输入一个数:"); int index = s.nextInt(); queue.add(index); break; case 'h'://查看队列头 System.out.println("队列的头是:"+queue.headQueue()); break; case 'e'://退出程序 loop = false; break; default: System.out.println("您好,您输入的字符不合法,请重新输入!"); break; } } System.out.println("您已经成功退出!"); } } //用数组模拟队列 class ArrayQueue{ private int maxSize;//数组的最大容量 private int front;//头结点 private int read;//尾结点 private int[] arr;//创建数组用于存放数据,模拟队列 /** * 构造方法 * @param arrMaxSize 队列能够拥有的最大容量 */ public ArrayQueue(int arrMaxSize){ maxSize = arrMaxSize;//传入数据表示队列能够拥有的最大容量 arr = new int[maxSize];//初始化数组 front = -1;//指向队列头结点的前一个位置 read = -1;//指向的是队列的尾结点(就是队列的最后一个数据) } /** * 判断队列是否满了,判断队列是否满的条件是:尾结点==队列最大容量-1 * @return */ public boolean isFull(){ return read == maxSize-1; } /** * 判断队列是否为空 * @return */ public boolean isAir(){ return front == read; } /** * 添加数据到队列 * @param data:添加的数据 */ public void add(int data){ //先判断队列是否满 if (isFull()){ System.out.println("队列已满,不能加入数据!"); return; } read++;//先让尾结点后移 arr[read] = data; } /** * 获取队列的数据,出队列 * @return */ public int get(){ //先判断队列是否为空 if (isAir()){ //通过抛出异常来解决 throw new RuntimeException("队列空,不能取数据!"); } front++;//让头结点后移一位 return arr[front]; } /** * 打印数据,就是遍历arr数组 */ public void listQueue(){ //判断队列是否为空 if (isAir()){ System.out.println("队列为空,没有数据!"); } for (int i=0;i<arr.length;i++){ System.out.println("arr["+i+"]="+arr[i]); } } /** * 显示队列的头数据 */ public int headQueue(){ if (isAir()){ throw new RuntimeException("队列是空的没有数据"); } return arr[front+1];//+1是因为头结点指向的是队列的前一个数据 } }