队列是一个有序的列表,原则:先入先出
简单数组实现:front指向队列头的前一个位置;rear指向队列的最后一个位置
front和rear的初始值都是-1;
//使用数组模拟队列--编写一个ArrayQueue类
class ArrayQueue{
private int maxSize;
private int array[];
private int front;
private int rear;
//构造函数 成员变量初始化
public ArrayQueue(int maxSize) {
this.maxSize=maxSize;
array=new int[maxSize];
front=-1;
rear=-1;
}
//判断队列是否为空
public boolean isEmpty() {
return front==-1&&rear==-1;
}
//判断队列否未满
public boolean isFull() {
return rear==maxSize-1;
}
//像队列中添加元素
public void addQueue(int n) {
//先判断是否为满
if(isFull()) {
System.out.println("队列已满~~");
}else {
rear++;
array[rear]=n;
}
}
//队列中取出元素
public int getQueue() {
//判断是否为空
if(isEmpty()) {
throw new RuntimeException("队列为空");
}else {
front++;
return array[front];
}
}
//遍历队列中的元素
public void showQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
for(int i=front+1;i<=rear;i++) {
System.out.printf("arry[%d]=%d\n",i,array[i]);
}
}
//显示队列的头元素
public int headQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
return array[front+1];
}
}
上述代码实现的队列存在问题:数组只能使用一次,没有达到复用的效果
使用数组模拟环形队列:1、front和rear调整:front指向对列的第一个元素,rear指向队列的最后一个元素的后一个位置 会空出一个空间为约定 front和rear的初始值都为0
2、队列为空的条件 ; rear=front; 队列满:(rear+1)%maxSize=front;
队列中的有效数据个数:(rear+maxSize- front)%maxsize
这个具体分析可以看看数据结构的书。找个具体的例子画画图家可以理解啦。。。
class CircleArrayQueue{
//环形队列的成员变量
private int maxSize;
private int array[];
private int front; //指向对列的第一个元素
private int rear; //指向最后一个元素的后一个位置
//构造函数 成员变量初始化
public CircleArrayQueue(int maxSize) {
this.maxSize=maxSize;
array=new int[maxSize];
front=0;
rear=0;
}
//判断队列是否为空
public boolean isEmpty() {
return front==rear;
}
//判断队列是否满
public boolean isFull() {
return (rear+1)%maxSize==front;
}
//获取队列中有效地数据个数
public int size(){
return (rear+maxSize-front)%maxSize;
}
//向队列中添加元素
public void addQueue(int n) {
if(isFull()) {
System.out.println("队列已满~~");
return;
}
array[rear]=n;
rear=(rear+1)%maxSize;
}
//队列中取出元素
public int getQueue() {
//判断是否为空
if(isEmpty()) {
throw new RuntimeException("队列为空~~");
}else {
int value=array[front];
front=(front+1)%maxSize;
return value;
}
}
//遍历队列中的元素
public void showQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
for(int i=front;i<front+size();i++) {
System.out.printf("arry[%d]=%d\n",i%maxSize,array[i%maxSize]);
}
}
//显示队列的头元素
public int headQueue() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
return array[front];
}
}