0
点赞
收藏
分享

微信扫一扫

使用数组模拟队列

深夜瞎琢磨 2022-04-14 阅读 89
java

队列特点:先进先出

采用数组来模拟队列

        收先创建一个容量为6的数组,因此定义一个maxSize=6,因为需要空出来一个容量,所以可以存储数据的容量为5,需要定义两个指针帮助我们遍历数组,一个是rear,用来指向最后加入的元素,另一个是front,用来指向最开始添加的元素。如果rear==front,就说明数组为空,如果(rear+1)%maxSize==front,说明数组已经满了,无法添加。相当于rear指向的位置刚好在front 下方,比如front指向0,rear指向5,(5+1)%6=0,数组满,但是由于需要空一个容量出来,其实数组下标为5的并没有内容,相当于rear指向的数组下标没有数据,正好满足需要空出来一个容量的要求。

        添加元素的时候需要先rear=rear%maxSize,然后在数组[rear]=需要添加的元素,最后在rear++;删除同理。

        遍历的时候需要判断rear和front的大小,根据他们的位置来判断遍历的顺序。

package Queue;

import java.util.Scanner;

/**
*用数组模拟队列,可重复使用
*/

public class ReQueueArray {
public static int maxSize;//为数组最大长度
public static int front=0;//头部指针 指向最开始添加的元素
public static int rear=0;//尾部指针 指向最后添加的元素
public static boolean flag=true;
public static int[] queueArray;//数组,用来模拟队列

public static void main(String[] args) {
createArray(6);
System.out.println("---------------------展示队列--------------------------");
Scanner scanner=new Scanner(System.in);
while (flag){
System.out.println("添加数据,请输入: add");
System.out.println("删除数据,请输入: sub");
System.out.println("显示队列,请输入: list");
System.out.println("退出,请输入: exit");
String s=scanner.nextLine();
switch (s){
case "add":
System.out.println("请输入要添加的数:");
int a=scanner.nextInt();
scanner.nextLine();
addElement(a);
break;
case "sub":
subElement();
System.out.println("删除成功!");
break;
case "list":
displayArray();
break;
case "exit":
System.out.println("---------------------展示结束--------------------------");
flag=false;
break;
default:
System.out.println("输入有误,请重新输入");
break;
}
}

}
/**
* 创建数组,用来模拟队列
* @param n 数组的长度
*/

public static void createArray(int n){
queueArray=new int[n];
maxSize=queueArray.length;

}
/**
* 判断数组是否为空
* @return 返回false代表不为空,返回ture代表为空
*/

public static boolean isEmpty(){
if (front==rear){
return true;
}
return false;
}
/**
* 判断数组是否满了 只要尾部指针在头部指针前一个 就是满了
* @return 返回false代表不满,返回ture代表满了
*/

public static boolean isFull(){
if ((rear+1)%maxSize==front){
return true;
}
return false;
}
/**
* 添加元素,按顺序
* @param element 添加的元素
*/

public static void addElement(int element){
//添加之前得判断是否数组是否满了,如果满了就不能添加了
if (isFull()){//数组满了 无法添加
System.out.println("队列已经满了无法添加!");
}else {//数组没有满,还可以添加
//添加元素
rear=rear%maxSize;
queueArray[rear]=element;
//头指针加1
rear++;
}
}

/**
* 删除队列中的元素,先添加的先删除,模拟先进先出
*/

public static void subElement(){
//删除元素之前先判断数组是否为空
if (isEmpty()){
System.out.println("队列为空,无法删除元素!");
}else {
//让当前尾部指针指向的元素为0
front=front%maxSize;
queueArray[front]=0;
//尾部指针加1
front++;
}
}
/**
* 输出数组
*/

public static void displayArray(){
if (isEmpty()){
System.out.println("队列为空!");
}else {
System.out.println("队列中的元素为:");
if (front<rear){
for (int i = front; i < rear; i++) {
System.out.println(queueArray[i]);
}
}else {
for (int i = front; i < maxSize; i++) {
System.out.println(queueArray[i]);
}
for (int i = 0; i < rear; i++) {
System.out.println(queueArray[i]);
}
}

}
}
}
举报

相关推荐

0 条评论