我们都知道,队列是一种先进先出的数据结构,每当有人问你队列是什么,你的回答就是 "一种先进先出的数据结构",当然这样的回答也是完全没有错的,它就是一种先进先出的数据结构,为什么我们不能描述的多一点呢?更详细一点?下面我们就来详细的描述一下队列。
队列是我们学习数据结构的一种重要的结构,它能帮我们帮我们解决生活中的一些问题,例如到银行办理业务,当人多的时候就需要取号排队,这就是队列的一种应用。队列的实现可以有两种方式来实现,一是用数组,二是链表,在这里我们就来说一下数组实现的方式,链表的实现方式我会在后续的更新中发出来。
下面我会先用图文的方式来描述队列到底是一个什么东西,以及它是怎么先进先出的,然后会说明一下怎么用代码去自己实现。
我们都知道队列是一种先进先出的数据结构,怎么个先进先出法?
首先,我们拥有一个数组,数组应当有这三个属性,头指针,尾指针,和长度。头指针应当指向队列的头一个元素,当从队列里面取出一个元素后,应当将它向后移一个位置,尾指针当有一个元素进来后也向后移一个位置。
首先一个初始的队列应该是这样的:
队头指针和队尾指针都在第一个位置,也表示这是一个空队列。
这时假如我们入队一个元素 1:
这时队列的头指针不变,队尾向后移动一次。
再入队一个元素 2:
这时候出队一个元素:
这时候对头指针向后移动,队尾指针不变。
以上就是队列的基本操作,入队出队的具体过程,你理解了嘛?
其实基本操作看起来比较简单,但是利用代码来完成这个过程还是有一定难度的。
我们在用代码实现的时候还要考虑许多问题,比如说我们怎么判断队列是空的还是满的,队列中有几个元素,还有就是当队尾指针到达数组的尾部之后怎么走?
这些问题都是我们需要考虑的。
下面我就展示一下代码:
定义我们需要的四个属性
private int maxSize; //数组长度
private int front; //对头指针
private int real; //队尾指针
private int[] arr; //数组
//初始化 构造器
public myQueue(int maxSize){
this.maxSize = maxSize;
arr = new int[maxSize];
}
判断队列是否满了:当队尾指针加一等于队头指针就队满了。
这里我们需要考虑到的因素是当队尾指针比队头指针小的情况。
public boolean isFull(){
return (real+1)%maxSize == front; //最后一个位置没用到
}
判断队列是否为空:
public boolean isEmpty(){
return front == real;
}
添加元素:
尾指针不能光顾着加啊,还要考虑到到达尾部之后要走到数组的前面去啊。
public void Add(int n){
if(isFull()){
System.out.println("队满");
return;
}
arr[real] = n;
real = (real+1)%maxSize;
}
出队:
public int OutQueue(){
if(isEmpty()){
throw new RuntimeException("队列为空!");
}
int temp = arr[front];
front = (front+1)%maxSize;
return temp;
}
查看队头元素:
//查看队列的第一个元素
public int HeadNum(){
if(isEmpty()){
throw new RuntimeException("队列为空!");
}
return arr[front];
}
查看队列中有效元素的个数:
public int CountQueue(){
if(isEmpty()){
return 0;
}
return (real+maxSize-front)%maxSize;
}
显示队列所有元素:
//显示队列的所有数据
public void ShowQueue(){
if(isEmpty()){
System.out.println("队列中没有数据");
return;
}
for(int i = front;i < front+CountQueue();i++){
System.out.println(arr[i%maxSize]);
}
}
本文中有几个需要注意的公式,就是判断队列是否满了:
(real+1)%maxSize == front
还要就是队尾指针和队头指针移动的操作:
real = (real+1)%maxSize;
查看队列中有效元素的个数:
(real+maxSize-front)%maxSize
还有就是遍历队列:
for(int i = front;i < front+CountQueue();i++){ System.out.println(arr[i%maxSize]); }
这些都是需要仔细想一下的地方,还请花点时间理解一下!