队列是一个有序列表,它可以用数组或者是链表来实现
遵循先进先出的原则。先存入的数据要先取出,后存入的要后取出
数组模拟队列
队列本身是有序队列,所以使用数组来实现
队列的输入和输出是有前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会根据队列的输出而改变,rear会根据队列的输入而改变。
往队列中插入数据
将尾指针rear后移,但是前提是rear小于队列的最大下标maxsize-1,当rear<maxseizes-1时将它放入当前rear的位置,如果rear == maxsize-1时队列满了
当rear=front时候为空
下面就可以上代码了
package com.gsy.queue;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
import java.util.Scanner;
/**
* @program: DataStructures
* @description: 使用数组来模拟队列
* @author: GSY
* @create: 2020-03-24 10:30
**/
public class ArrayQueueDemo {
public static void main(String[] args){
ArrayQueue arrayQueue = new ArrayQueue(3);
int flag;//接收用户输入
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while (loop){
System.out.printf("1(show):展示数据\n");
System.out.printf("2(exit):退出程序\n");
System.out.printf("3(add):添加数据\n");
System.out.printf("4(get):取出数据\n");
System.out.printf("5(head):查看队列头数据\n");
flag = scanner.nextInt();
switch (flag){
case 1 : arrayQueue.showQueue();
break;
case 2 : scanner.close();
loop = false;
System.out.printf("程序退出\n");
break;
case 3 :
System.out.printf("输入一个数字\n");
int value = scanner.nextInt();
arrayQueue.addQueue(value);
break;
case 4 :
try {
int queuevaule = arrayQueue.getQueue();
System.out.printf("取出的数据为:%d\n",queuevaule);
}catch (Exception e){
System.out.printf(e.getMessage());
}
break;
case 5 :
try {
System.out.printf("队列头数据为%d\n",arrayQueue.headQueue());
}catch (Exception e){
System.out.printf(e.getMessage());
}
break;
default:
break;
}
}
}
}
//使用数组实现一个队列
class ArrayQueue{
private int maxsize;//队列的容量
private int front;//队列头指针,指向队列头的前一个位置
private int rear;//队列尾指针,指向队列的最后一个数据
private int[] arr;//用数组来模拟队列
public ArrayQueue(int Maxsize){
this.maxsize = Maxsize;
arr = new int[maxsize];//初始化队列
rear = -1;
front = -1;
}
//判断队列是否满
public boolean isFull(){
return rear == maxsize - 1;
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front ;
}
//向队列中加入数据
public void addQueue(int n){
//判断队列是否满
if (isFull()){
System.out.printf("队列已经满了,不难再加入数据\n");
return ;
}
rear++;//尾指针向后移动
arr[rear] = n;
}
//从队列中取出数据
public int getQueue(){
//先判断队列是否为空
if (isEmpty()){
throw new RuntimeException("队列为空,不能取出数据\n");
}
front ++ ;
return arr[front];
}
//显示队列的所有数据
public void showQueue(){
//判断队列是否为空
if (isEmpty()){
System.out.printf("队列为空,没有数据\n");
return;
}
for (int i = 0 ; i <= rear ; i++){
System.out.printf("arr[%d]=%d\n",i,arr[i]);
}
}
//取出队列的头数据
public int headQueue(){
//判断队列是否为空
if (isEmpty()){
throw new RuntimeException("队列为空,没有头数据\n");
}
return arr[front+1];
}
}
用数组实现这个队列的话比较简单,但是有一些不好的地方就是这个队列不可以重复使用,当你存入数据,然后从队列拿出数据之后,就不可以再存入数据,因为当你取出数据的时候它只有队列头发生变化,队列尾没有发生变化,然后它一直一直队列是是满的,其实是还有空间。
这个时候就要用循环队列了。
下个博客实现。
循环队列地址:https://blog.csdn.net/weixin_43404016/article/details/105177325