队列是一种线性结构,除了第一个元素和最后一个元素的其它元素外都有唯一的前驱和唯一的后继。
图解单向队列,完成一个队列需要4个属性值:maxSize,front,rear,array。
maxSize表示队列中可以存储最多的元素的个数,假设maxSize=4,array是存储数据的数组,front表示队列的头部,rear表示队列最后一个元素的下一个位置,一开始队列中是没有值的,所以我们让rear=front=0,此时表示队列为空。
当我们向队列中添加一个元素时:rear++,此时front = 0,rear = 1。
依次添加,直到队列中的元素已经添加满了
此时rear = 4,front = 0。rear=maxSize时表示队列已经填满了元素,front=0表示队列还没有开始移除元素。
当我们移除队列中的元素时,front++。
逻辑:
判断队列是否为空:front==rear为真,则队列为空,否则队列不为空。
判断队列是否已满:rear==maxSize为真,则队列已满,否则队列未满。
每次添加元素前,都要判断队列是否满了,移除或者查看队列中的元素时,则要判断队列是否为空。
可以发现,我们每次向队列中添加元素或者移除元素时,rear++或者front++是一个单方向的事件,既当我们已经添加满队列了,然后又把队列中的所以数据移除后,rear=front=4,但是这时候队列已经时空的了,我们却无法再向队列中添加元素,这就是单向队列的缺点,数组无法被重复使用,只能使用一次。解决办法是使用数组实现循环队列。
数组实现单向队列的代码和测试代码
//测试类
public class SingleQueue {
public static void main(String[] args) {
MyQueue myQueue = new MyQueue(3);
boolean flag = true;
char ch;
Scanner sc = new Scanner(System.in);
while (flag){
System.out.println("a:添加一个元素\nb:移除一个元素\nc:查看队列元素\nd:退出程序");
ch = sc.next().charAt(0);
switch (ch){
case 'a':
myQueue.addElement();
break;
case 'b':
myQueue.removeElement();
break;
case 'c':
myQueue.showQueueElement();
break;
default:
flag = false;
break;
}
}
}
}
//用数组实现一个单向队列
class MyQueue{
private int maxSize;//队列最多存储多少个元素
private int rear;//尾指针:记录最后一个进入队列的数据
private int front;//头指针:记录第一个进入队列(还没有出队列)的数组
private int[] arr;
public MyQueue(int maxSize){
this.maxSize = maxSize;
this.arr = new int[maxSize];
this.rear = 0;
this.front = 0;
}
//队列是否满了
public boolean isFull(){
return this.rear == this.maxSize;
}
//队列是否为空
public boolean isEmp(){
return rear == front;
}
//添加元素
public void addElement(){
int e;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数");
e = sc.nextInt();
//对列是否满
if(isFull()){
System.out.println("队列已满");
return;
}else {
this.arr[this.rear] = e;
this.rear++;
}
}
//移除元素
public void removeElement(){
if(isEmp()){
return;
}
this.front++;
}
//队列元素的个数
public void countQueue(){
System.out.println("队列中元素的个数是:"+ (this.rear - this.front));
}
//查看队列中的元素
public void showQueueElement(){
if(isEmp()){
System.out.println("队列中没有元素!");
return;
}
for (int i = this.front;i<this.rear;i++){
System.out.print(this.arr[i]+"\t");
}
}
}