队列
是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作
,而在表的后端(rear)进行插入操作
,和栈一样,队列是一种操作受限制的线性表
。进行插入操作的端称为队尾
,进行删除操作的端称为队头
本文为数组模拟队列
一、定义ArrayQueue
class ArrayQueue{
private int maxSize; // 数组的最大容量
private int front;// 队列头
private int rear;// 队列尾
private int[] arr;// 该数组用于存放数据, 模拟队列
public ArrayQueue(int maxSize){// 初始化队列
this.maxSize = maxSize;
this.front = -1;// 指向队列头部
this.rear = -1;// 指向队列尾部
arr = new int[maxSize];// 初始化数组
}
/**
* 判断队列是否已满
* @return true 为满 false为未满
*/
public boolean isFull(){
return this.rear == this.maxSize - 1;
}
/**
* 判断队列是否为空
* @return true为空 false已经有了数据
*/
public boolean isEmpty(){
return this.rear == this.front;
}
/**
* 添加数据到队列中
* @param n
*/
public void inQueue(int n){
// 1.判断队列是否已满
if (isFull()){
System.out.printf("队列已满,%d无法存入队列中\n",n);
return;
}
this.rear++;
this.arr[rear] = n;
}
/**
* 出队列
* @return
*/
public int outQueue(){
// 1.判断是否为空
if (isEmpty()){
throw new RuntimeException("队列为空,不能出队列");
}
this.front++;
// 返回数据
return this.arr[front];
}
/**
* 显示队列所有数据
*/
public void listQueue(){
// 1.判断是否为空
if (isEmpty()){
throw new RuntimeException("队列为空");
}
System.out.println("--------队列数据显示-------");
for (int i = 0; i < arr.length; i++) {
System.out.printf("arr[%d]=%d\n",i,arr[i]);
}
System.out.println();
}
/**
* 得到队头数据
* @return
*/
public int getHeadQueue(){
// 1.判断是否为空
if (isEmpty()){
throw new RuntimeException("队列为空~~~");
}
// 2.返回
return this.arr[this.front + 1];
}
}
二、main方法进行测试
public static void main(String[] args) {
System.out.println("测试数组模拟队列~~~");
ArrayQueue queue = 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':
queue.listQueue();
break;
case 'e':
loop = false;
break;
case 'a':
System.out.println("请输入一个数:");
int number = scanner.nextInt();
queue.inQueue(number);
break;
case 'g':
queue.outQueue();
break;
case 'h':
System.out.println(queue.getHeadQueue());
break;
default:
loop = false;
break;
}
}
System.out.println("---------程序结束--------");
}
三、结果演示
测试数组模拟队列~~~
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head):查看队头数据
a
请输入一个数:
1
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head):查看队头数据
a
请输入一个数:
2
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head):查看队头数据
a
请输入一个数:
3
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head):查看队头数据
g
1
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head):查看队头数据
s
--------队列数据显示-------
arr[0]=1
arr[1]=2
arr[2]=3
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head):查看队头数据
g
2
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head):查看队头数据
s
--------队列数据显示-------
arr[0]=1
arr[1]=2
arr[2]=3
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head):查看队头数据
g
3
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列取出数据
h(head):查看队头数据
四、全部代码
package com.wolf.arrayQueue;
import java.util.Scanner;
/**
* 数组模拟队列
*/
public class ArrayQueueDemo {
public static void main(String[] args) {
System.out.println("测试数组模拟队列~~~");
ArrayQueue queue = 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':
queue.listQueue();
break;
case 'e':
loop = false;
break;
case 'a':
System.out.println("请输入一个数:");
int number = scanner.nextInt();
queue.inQueue(number);
break;
case 'g':
System.out.println(queue.outQueue());
break;
case 'h':
System.out.println(queue.getHeadQueue());
break;
default:
loop = false;
break;
}
}
System.out.println("---------程序结束--------");
}
}
class ArrayQueue{
private int maxSize; // 数组的最大容量
private int front;// 队列头
private int rear;// 队列尾
private int[] arr;// 该数组用于存放数据, 模拟队列
public ArrayQueue(int maxSize){// 初始化队列
this.maxSize = maxSize;
this.front = -1;// 指向队列头部
this.rear = -1;// 指向队列尾部
arr = new int[maxSize];// 初始化数组
}
/**
* 判断队列是否已满
* @return true 为满 false为未满
*/
public boolean isFull(){
return this.rear == this.maxSize - 1;
}
/**
* 判断队列是否为空
* @return true为空 false已经有了数据
*/
public boolean isEmpty(){
return this.rear == this.front;
}
/**
* 添加数据到队列中
* @param n
*/
public void inQueue(int n){
// 1.判断队列是否已满
if (isFull()){
System.out.printf("队列已满,%d无法存入队列中\n",n);
return;
}
this.rear++;
this.arr[rear] = n;
}
/**
* 出队列
* @return
*/
public int outQueue(){
// 1.判断是否为空
if (isEmpty()){
throw new RuntimeException("队列为空,不能出队列");
}
this.front++;
// 返回数据
return this.arr[front];
}
/**
* 显示队列所有数据
*/
public void listQueue(){
// 1.判断是否为空
if (isEmpty()){
throw new RuntimeException("队列为空");
}
System.out.println("--------队列数据显示-------");
for (int i = 0; i < arr.length; i++) {
System.out.printf("arr[%d]=%d\n",i,arr[i]);
}
System.out.println();
}
/**
* 得到队头数据
* @return
*/
public int getHeadQueue(){
// 1.判断是否为空
if (isEmpty()){
throw new RuntimeException("队列为空~~~");
}
// 2.返回
return this.arr[this.front + 1];
}
}