1、队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如上图,其中maxSize是队列的最大容量;
2、队列的输入、输出分别从前后端处理,因此需要front和rear两个变量分别记录队列前后端的下标,其会随着数据输入而改变;
3、将数据存入的队列为“queue":
①、对空:rear==front;
②、队满:rear=maxSize-1;
③、当尾指针rear<maxSize-1时,则将数据存入rear所指的数组中。
视频教程分享:java视频教程
具体实现代码如下:
(1)、判断队列是否满
(2)、判断队列是否为空
(3)、添加数据到队列中
(4)、获取队列的数据,出队列;
(5)、显示当前队列数据;
(6)、显示队列的头数据,注意不是取出数据;
示例如下:
packagecom.ycx.queue;
importjava.util.Scanner;
publicclassArrayQueueDemo{
publicstaticvoidmain(String[]args){
//测试
//创建一个队列
ArrayQueuequeue=newArrayQueue(3);
charkey='';//接受用户输入
Scannerinput=newScanner(System.in);
booleanflag=true;//控制循环默认死循环
//输出菜单
while(flag){
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=input.next().charAt(0);//接受收一个字符
switch(key){
case's':
queue.showQueue();
break;
case'a':
System.out.println("输一个数");
intval=input.nextInt();
queue.addQueue(val);
break;
case'g'://取出数据因为方法里面抛出了异常所以这里需要捕获
try{
intres=queue.getQueue();
System.out.printf("取出的数据为%d\n",res);
}catch(Exceptione){
System.out.println(e.getMessage());
}
break;
case'h':
try{
intres=queue.headQueue();
System.out.printf("队列头的数据为%d\n",res);
}catch(Exceptione){
System.out.println(e.getMessage());
}
break;
case'e'://退出程序
input.close();//关闭
flag=false;
break;
default:
break;
}
}
System.out.println("程序退出");
}
}
//一、使用数组模拟队列-编写一个ArrayQueue类
classArrayQueue{
privateintmaxSize;//表示数组的最大容量
privateintfront;//队列头
privateintrear;//队列尾
privateint[]arr;//该数组用于存放数据,模拟队列
//创建队列的构造器
publicArrayQueue(intarrMaxsize){
maxSize=arrMaxsize;
arr=newint[maxSize];//初始化数组
front=-1;//指向队列头部,分析出front是指向队列头的前一个位置有效数据的位置
rear=-1;//指向队列尾,指向队列尾的数据(即就是队列最后一个位置)
}
//1.判断队列是否满
publicbooleanisFull(){
returnrear==maxSize-1;//因为rear是从-1开始的(如果不理解就看笔记上的图)
}
//2.判断队列是否为空
publicbooleanisEmpty(){
returnrear==front;
}
//3.添加数据到队列中
publicvoidaddQueue(intn){
//判断队列是否为满
if(isFull()){
System.out.println("队列已满,不能加入数据");
}
rear++;//rear后移
arr[rear]=n;//也可以直接写成arr[++rear]:rear先加再取值
}
//4.获取队列的数据,出队列
publicintgetQueue(){
if(isEmpty()){
thrownewRuntimeException("队列空,不能取数据");
}
front++;//front后移因为front指向的是前一个元素(front=-1)
returnarr[front];
}
//5.显示当前队列数据
publicvoidshowQueue(){
//遍历
if(isEmpty()){
System.out.println("当前队列为空");
return;
}
for(inti=0;i<arr.length;i++){
System.out.printf("arr[%d]=%d\n",i,arr[i]);//格式化输出
}
}
//6.显示队列的头数据,注意不是取出数据
publicintheadQueue(){
if(isEmpty()){
thrownewRuntimeException("队列为空");
}
returnarr[front+1];//注意:front需要加1
}
}
问题分析并优化
(1)、缺点:数组只能使用一次,不能实现代码的复用。
(当把数组中所有的元素取出来后,数组为空,但无法添加元素进入数组)
(2)、优化:可以改成一个环形的数组(进行取余)。


本文转载自中文网
本文转载自中文网
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h55942.shtml