标签:Java
数据结构
算法
作者 : Maxchen
版本 : V1.0.0
日期 : 2020/3/29
1.队列的概念
队列同样是一种特殊的线性表,其插入和删除的操作分别在表的两端进行,队列的特点就是先进先出(First In First Out)。我们把向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue)并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列则称为空队。其一般结构如下1
2.数组模拟队列
我们使用数组来模拟一个简单的队列运行程序,整体运行流程如下图
代码分两部分:第一部分
ArrayQueue
是使用数组来模拟队列,第二部分ArrayQueueDemo
则是对此队列进行测试。
ArrayQueue
的代码如下
//使用数组模拟队列
class ArrayQueue{
//数组最大容量
private int maxSize;
//队列头
private int front;
//队列尾
private int rear;
//存放数据并模拟队列
private int[] arr;
//队列构造器
public ArrayQueue(int arrMaxSize){
maxSize = arrMaxSize;
arr = new int[maxSize];
front = -1;
rear = -1;
}
//判断队列是否满
public boolean isFull(){
return rear == maxSize - 1;
}
//判断队列是否空
public boolean isEmpty(){
return rear == front;
}
//添加队列数据,入队列
public void addQueue(int n){
//队列满了不能加入数据
if(isFull()){
throw new RuntimeException("队列满了不能加入数据");
}
rear++;
arr[rear] = n;
}
//获取队列数据,出队列
public int getQueue(){
//队列空,不能取数据
if(isEmpty()){
throw new RuntimeException("队列空,不能取数据");
}
front ++;
return arr[front];
}
//显示队列所有数据
public void showQueue(){
//遍历
if(isEmpty()){
System.out.println("队列空,无数据");
return;
}
for (int i=0; i< arr.length; i++){
System.out.printf("arr[%d]=%d\n", i, arr[i]);
}
}
//显示队列的头数据
public int headQueue(){
//判断
if(isEmpty()){
throw new RuntimeException("队列空的,没有数据");
}
return arr[front + 1];
}
}
ArrayQueueDemo
的代码如下
public class ArrayQueueDemo {
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("添加队列数据");
try {
int value = scanner.nextInt();
arrayQueue.addQueue(value);
} catch (Exception e) {
e.printStackTrace();
}
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.headQueue();
System.out.printf("队列头的数据:%d\n", res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序结束");
}
}
3.队列运行测试
第一步: 执行程序主函数,会初始化一个包含3个数组元素的空队列,输入s会显示队列空,无数据
第二步: 输入a提示添加队列数据
,我们添加一个队列
第三步: 再次点击s,就会查询到刚才添加的队列数据
第四步: 继续添加队列,直到添加到第四个队列时会提示队列已满无法添加
第五步: 接下来我们用h查询队列头的数据,按g就会出一个队列,队列头变成下一个队列数组,直到队列获取完为止