队列(数组模拟队列)

71 阅读3分钟

“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

队列(数组模拟队列)

定义:队列是一个有序列表,可以用数组或者链表来实现。

遵循先进先出原则。即:先存入队列的数据,要先取出。后存入的数据要后取出

数组模拟队列

队列本身是有序列表,所以可以使用数组的结构来模拟存储队列的数据,其中maxSize是该队列的最大容量。

因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front 会随着数据输出而改变,而rear则是随着数据输入而改变。如图所示:

图片.png

数组模拟队列

当我们将数据存入队列时称为”addQueue",addQueue的处理需要有两个步骤:

思路分析

1)将尾指针往后移:rear+1,当front == rear【空】

2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据。rear == maxSize -1[队列满]

初始化ArrayQueue arrayQueue = new ArrayQueue(3)

1.rear是队列尾部的位置rear=-1;

  1. front是队列头部的前一个位置front=-1;

3.根据最大值来创建数组

array=new int[maxsize];

先使用数组创建一个类模拟一个队列,然后再通过使用代码测试是否可以创建成功

1)使用数组模拟一个队列

使用数组模拟队列-编写一个ArrayQueue类

代码实现:


**private** **int** maxsize; //数组的最大容量

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

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

**private** **int** array[]; //用于存放数据,模拟队列

//创建队列的构造器

**public** ArrayQueue(**int** arraymaxsize) {

maxsize=arraymaxsize;

array=**new** **int**[maxsize];

front=-1;  //指向队列头部,分析出front是指向队列头的前一个位置

rear=-1;  //指向队列尾部,分析出rear是指向队列尾的数据

}

//判断队列是否是满的

**public** Boolean isFull() {

**return** rear==maxsize-1;

}

//判断队列是否是空的

**public** Boolean isNull() {

**return** rear==front;

}

//将数据添加到队列中

**public** **void** addqueue(**int** n) {

//判断是否满了

**if** (isFull()) {

System.***out***.println("队列已满,不能存放数据");

**return**;

}

rear++;

array[rear]=n;

}

//将数据移除队列中

**public** **int** getqueue() {

//判断是否为空

**if** (isNull()) {

**throw** **new** RuntimeException("队列为空,没有数据");

}

front++;

**return** array[front];

}

//显示队列中的所有数据

**public** **void** showqueue() {

//判断是否为空

**if** (isNull()) {

System.***out***.println("队列为空,无数据");

**return**;

}

**for**(**int** i=0;i<array.length;i++) {

System.***out***.printf("arr[%d]=%d\n",i,array[i]);

}

}

//显示队列头数据

**public** **int** headerqueue() {

//判断是否为空

**if** (isNull()) {

**throw** **new** RuntimeException("队列为空,没有数据");

}

**return** array[front+1];

}

}

2)使用代码测试是否可以创建成功

代码实现:


**public** **static** **void** main(String[] args) {

//创建一个队列

ArrayQueue arrayQueue = **new** ArrayQueue(3);

//接受用户输入

**char** key=' ';

Scanner scanner = **new** Scanner(System.***in***);

**boolean** loop=**true**;

**while**(loop) {

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)查看队列头数据");

key=scanner.next().charAt(0);//接收一个字符

**switch** (key) {

**case** 's':

arrayQueue.showqueue();

**break**;

**case** 'a':

System.***out***.println("请输入一个数");

**int** value=scanner.nextInt();

arrayQueue.addqueue(value);

**break**;

**case** 'g':

**try** {

**int** res=arrayQueue.getqueue();

System.***out***.printf("取出的数据是%d\n",res);

} **catch** (Exception e) {

System.***out***.println(e.getMessage());    

}

**break**;

**case** 'h':

**try** {

**int** res=arrayQueue.headerqueue();

System.***out***.printf("队列头数据是%d\n",res);

} **catch** (Exception e) {

System.***out***.println(e.getMessage());    

}

**break**;

**case** 'e':

scanner.close();

loop=**false**;

**break**;

**default**:

System.***out***.println("输入的不在范围内");;

}

}

System.***out***.println("程序已经成功退出");

}

}