数据结构算法学习之队列(数组模拟java实现)
数组模拟队列
数组模拟队列
今天学习数组模拟队列。队列常用于生活中的方方面面。比如银行叫号排队。实际上就是队列。所有人抽号排队。先去的先抽号。所以靠前的号最后会先被叫到然后出队。后边的会随之往前移位。也就是队伍中的顺序会发生变化。
实际上用数组很容易模拟出来队列。
队列的几大要素。队列长度(MaxSize) 队列头部的前一个位置front,队列的尾部rear,还有我们的数组arr[]。我们需要创建Queue类来模拟队列。
package com.joseph.sparseArray;
public class ArrayQueue {
public static void main(String[] args) {
Queue queue = new Queue(3);
System.out.println("数组模拟队列长度为:" + queue.arr.length + ",MaxSize = " + queue.MaxSize);
queue.addQueue(10);
queue.List();
System.out.println("rear:" + queue.rear);
System.out.println("front" + queue.front);
System.out.println("头数据:" + queue.arr[queue.front + 1]);
System.out.println("队尾数据:" + queue.arr[queue.rear]);
System.out.println("---------------------------------------------------------------------");
queue.addQueue(20);
queue.List();
System.out.println("rear:" + queue.rear);
System.out.println("front" + queue.front);
System.out.println("头数据:" + queue.arr[queue.front + 1]);
System.out.println("队尾数据:" + queue.arr[queue.rear]);
System.out.println("---------------------------------------------------------------------");
queue.getQueue();
queue.List();
System.out.println("rear:" + queue.rear);
System.out.println("front" + queue.front);
System.out.println("头数据:" + queue.arr[queue.front + 1]);
System.out.println("队尾数据:" + queue.arr[queue.rear]);
System.out.println("---------------------------------------------------------------------");
queue.addQueue(40);
queue.List();
System.out.println("rear:" + queue.rear);
System.out.println("front" + queue.front);
System.out.println("头数据:" + queue.arr[queue.front + 1]);
System.out.println("队尾数据:" + queue.arr[queue.rear]);
}
}
class Queue{
int MaxSize ;
int rear ;
int front ;
int arr[] ;
public Queue(int MaxSize) {
this.MaxSize = MaxSize ;
arr = new int[MaxSize];
this.rear = -1;
this.front = -1;
}
public boolean isFull(){
return rear == MaxSize -1 ;
}
public boolean isEmpty(){
return rear == front ;
}
public void addQueue(int key){
//判断是否已满
if(isFull()){
System.out.println("QUEUE IS FULL!");
return ;
}
//没满
this.rear ++ ;
arr[rear] = key ;
if(arr[rear] == key){
System.out.println("添加成功!");
}else{
System.out.println("添加失败!");
}
}
public int getQueue(){
//判断为空
if(isEmpty()){
throw new RuntimeException("QUEUE IS EMPTY");
}
//不为空
this.front ++ ;
return arr[front];
}
public void List(){
//判断
if(isEmpty()){
System.out.println("QUEUE IS EMPTY!");
return ;
}
for(int i = 0 ; i < arr.length ; i ++){
System.out.printf("arr[%d] = %d\n",i,arr[i]);
}
}
}
/**
* @author JosephWang
* @date 2021/8/9 17:18
*/
注意:
心系的小伙伴已经发现了我们的瑕疵。这个数组模拟队列已经完成了。但是数组是一次性的。我们发现当数组满了或者没满。队列的头和尾使用我们的rear和front来指向的。而取出数据后的下标将被弃用。导致浪费。我们下期将优化这种浪费。