“携手创作,共同成长!开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情”
队列(数组模拟队列)
定义:队列是一个有序列表,可以用数组或者链表来实现。
遵循先进先出原则。即:先存入队列的数据,要先取出。后存入的数据要后取出
数组模拟队列
队列本身是有序列表,所以可以使用数组的结构来模拟存储队列的数据,其中maxSize是该队列的最大容量。
因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front 会随着数据输出而改变,而rear则是随着数据输入而改变。如图所示:
数组模拟队列
当我们将数据存入队列时称为”addQueue",addQueue的处理需要有两个步骤:
思路分析
1)将尾指针往后移:rear+1,当front == rear【空】
2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据。rear == maxSize -1[队列满]
初始化ArrayQueue arrayQueue = new ArrayQueue(3)
1.rear是队列尾部的位置rear=-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("程序已经成功退出");
}
}