行列

先进先出

什么意思呢?

我的明白:行列就是一个数组(不包罗链表),然后我们给它施加一个存数据和取数据的规则

当只允许从一端存数据,从另一端取数据的数组,就是行列,我们要做的就是给这个数组施加我们制订的规则

不明白就上图

java数组怎么不按下标插入_数组

图解步骤:

【图(a)】有一个长度为5的数组,界说头部标志和尾部标志

【图(b)】按顺序插入e1,e2,e3数据,插入数据从尾部插入,此时头部标志稳定,插入一个数据,尾部标志就加1

【图(c)】取元素就只能从头部取,每取一个数据,头部标志就加一

【图(d)】这样就形成了先进先出的规则

再不明白多思索,多敲两遍代码,或者讲一遍给别人听

代码实现

public class ArrayQueue {
//最大长度
int maxSize;
//界说一个数组,存储数据
private int[] queue;
//界说对头和队尾标志
private int front;
private int rear;
//初始化一个数组
public void init(int maxSize){
front = -1;
rear = -1;
this.maxSize = maxSize;
this.queue = new int[maxSize];
}
//判断对满
public boolean isFull(){
return rear == maxSize-1;
}
//判断队空
public boolean isEnpty(){
return front == rear;
}
//加入数据,只能从队头加入
public void add(int num){
if(isFull()){
System.out.println("行列满了,插入失败");
return;
}
//要理清晰先后顺序
rear++;
queue[rear] = num;
}
//取数据,只能从队尾取
public int get(){
if(isEnpty()){
System.out.println("行列为空");
//数组初始化之后默认值就是0
return 0;
}
front++;
return queue[front];
}
//查看队头元素
public int showFront(){
if(isEnpty()){
System.out.println("行列为空");
//数组初始化之后默认值就是0
return 0;
}
return queue[front+1];
}
//遍历所有数
public void showAll(){
if(isEnpty()){
System.out.println("行列为空");
//数组初始化之后默认值就是0
return;
}
System.out.println("显示行列:======");
for(int i = front+1; i <= rear; i++){
System.out.println(queue[i]);
}
System.out.println("===============");
}
}

【代码改善】

使用这个行列,你会觉得很难受,由于你界说了它的长度,它的长度就不能改变了,我们可以设计一个长度可以增添的行列

【设计思绪】

当rear==maxSize,即数组满了的时刻,我们新建一个数组,比原数组长一倍,然后将原数组的值赋值到新数组

【代码实现】

我们只要修改add方式的代码

public void add(int num){
if(isFull()){
//新建一个长度为原来两倍的数组
int[] newQueue = new int[maxSize*2];
//原数组赋值到新数组
for(int i = front+1; i <= rear; i++){
newQueue[i] = queue[i];
}
rear++;
queue[rear] = num;
return;
}
rear++;
queue[rear] = num;
}

【思索】

实在代码另有许多改善空间

1.好比这里我们写死了只能使用int类型的数组,那么我们能不能将类型像参数一样,在初始化行列的时刻再确认呢?这里可以用到泛型知识

2.再好比取数据的时刻,当这个数不存在的时刻我们返回的是默认值0,能不能不返回0,也能使代码正常竣事呢,这里可以用到异常知识

数据结构的改善

我们会发现,若是使用这种结构来建立行列,当取出数据后,front前面的空间就不能举行操作了,造成了大量的空间虚耗,这个时刻我们可以

将顺序行列假象成一个环