在数组中,若知道数据项的下标,便可立即访问该数据项,或者通过顺序搜索数据项,访问到数组中的各个数据项。
但是栈和队列不同,它们的访问是受限制的,即在特定时刻只有一个数据项可以被读取或者被删除
队列是先进先出,只能访问头部数据
队列也可以用数组来实现,不过这里有个问题,当数组下标满了后就不能再添加了,但是数组前面由于已经删除队列头的数据了,导致空。所以队列我们可以用循环数组来实现,见下面的代码:
下面用数组来实现的基本操作代码:
/**
* 数组实现一个队列
* 队列是先进先出,只能访问头部数据
*/
public class ArrayQueue {
private long[] a;
private int size;//数组大小
private int nIteams;//实际存储数量:记录队列中有多少值 删除就-- 添加就++
private int front;//头:主要是删除的时候记录,删除到哪里了
private int rear;//尾:主要是添加的时候记录,添加到哪里了
public ArrayQueue(int maxSize){
this.size = maxSize;
a = new long[size];
front = 0;
nIteams = 0;
rear = -1;
}
//添加一个
public void add(long value){
if(isFull()){
System.out.println("队列已经满了");
return;
}
rear = ++rear % size;//
a[rear] = value;//尾指针满了就循环到0处,这句相当于下面注释内容
nIteams ++;
/*
if(rear == size-1){
rear = -1;
}
a[++rear] = value;
*/
}
//删除一个
public long remove(){
if(isEmpty()){
System.out.println("队列为空");
return 0;
}
nIteams --;
front = front % size;
return a[front++];//去出来一个头部就减少一个 头就添加1
}
//查看第一个
public long peek(){
if(isEmpty()){
System.out.println("队列为空");
return 0;
}
return a[front];
}
public void display(){
/*if(isEmpty()){
System.out.println("队列为空");
return;
}*/
System.out.print("[");
int item = front;
for (int i = 0; i < nIteams; i++) {
System.out.print(a[item++ % size]);
if(i != nIteams-1){
System.out.print(",");
}
}
System.out.println("]");
}
//是否满了
public boolean isFull(){
return (nIteams == size);
}
//是否为空
public boolean isEmpty(){
return (nIteams == 0);
}
//队列的大小
public int size(){
return nIteams;
}
}
测试代码:
import java.util.PriorityQueue;
import java.util.Queue;
public class QueueDemo {
public static void main(String[] args) {
//测试真实队列
/*Queue queue = new PriorityQueue();
System.out.println(queue.size());
System.out.println(queue);
queue.add(1);
queue.add(2);
queue.add(3);
System.out.println(queue);
System.out.println(queue.size());
queue.remove();
System.out.println(queue);
System.out.println(queue.peek());
System.out.println(queue);*/
//测试自己的队列
ArrayQueue queue = new ArrayQueue(5);
queue.display();
System.out.println(queue.size());
System.out.println(queue.isEmpty());
queue.add(1);
queue.add(2);
queue.add(3);
System.out.println(queue.size());
queue.display();
queue.remove();
queue.display();
System.out.println(queue.peek());
}
}
总结:
和栈一样,队列中插入数据项和删除数据项的时间复杂度均为O(1)。
优先级队列:
还有个优先级队列,优先级队列是比栈和队列更专用的数据结构。优先级队列与上面普通的队列相比,主要区别在于队列中的元素是有序的,关键字最小(或者最大)的数据项总在队头。数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序。优先级队列的内部实现可以用数组或者一种特别的树——堆来实现。