我们先来回顾下什么是队列数据结构:
- 队列是一种先进先出,后进后出的线性表
- 加数据是在队列的尾部加,取数据是在队列的头部取
- 队列只允许在后端(称为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){
System.out.println("arr["+i+"]="+arr[i]);
}
}
/**
* 显示队列的头数据
*/
public int headQueue(){
if (isAir()){
throw new RuntimeException("队列是空的没有数据");
}
return arr[front+1];//+1是因为头结点指向的是队列的前一个数据
}
}