1、核心思想:
类似于栈,不同的是队列中第一个插入的数据项会最先移除,即先进先出。
队头取数据,队尾存数据。
2、实现队列
public class TestQueue {
public static void main(String[] args) {
Queue queue=new Queue(5);
System.out.println(queue.isEmpty());
queue.insert(50);
queue.insert(51);
queue.insert(52);
queue.insert(53);
queue.insert(54);
System.out.println(queue.isEmpty());
System.out.println(queue.isFull());
while(!queue.isEmpty()){
System.out.println(queue.remove());
}
//queue.insert(20);//报错,队尾存数据++end已经到了5,再存会越界
queue.remove();//报错,队头移数据时font++到了5,再移会越界
}
}
public class Queue {
//数组
private long[] arr;
//最大空间
private int maxSize;
//有效元素大小
private int elems;
//队头
private int font;
//队尾
private int end;
//构造函数
public Queue(int maxSize){
this.maxSize=maxSize;
arr=new long[maxSize];
elems=0;
font=0;
end=-1;
}
//插入数据
public void insert(long value){
arr[++end]=value;//队尾存数据,从0开始
elems++;
}
//移除数据
public long remove(){
elems--;
return arr[font++];//队头移数据
}
//是否为空
public boolean isEmpty(){
return (elems==0);
}
//是否满了
public boolean isFull(){
return (end==maxSize-1);
}
//返回有效元素大小
public int size(){
return elems;
}
}
3、循环队列
public static void main(String[] args) {
MyQueue queue=new MyQueue(5);
System.out.println(queue.isEmpty());//true
queue.insert(30);
queue.insert(20);
queue.insert(10);
queue.insert(2);
queue.insert(1);
queue.insert(111);//已经满了再插入,会覆盖队头的30
while(!queue.isEmpty()){
System.out.print(queue.remove()+" ");
}
//111 20 10 2 1 111,注意有6个数,因为elems=6
}
public class MyQueue {
//数组
private long[] arr;
//最大空间
private int maxSize;
//有效元素大小
private int elems;
//队头
private int font;
//队尾
private int end;
//构造函数
public MyQueue(int maxSize){
this.maxSize=maxSize;
arr=new long[maxSize];
elems=0;
font=0;
end=-1;
}
//插入数据
public void insert(long value){
if(end==maxSize-1){
end=-1;//循环队列,赋初值
}
arr[++end]=value;//队尾存数据,从0开始
elems++;
}
//移除数据
public long remove(){
long tmp=arr[font++];
if(font==maxSize){
font=0;//循环队列,赋初值
}
elems--;
return tmp;//队头移数据
}
//是否为空
public boolean isEmpty(){
return (elems==0);
}
//是否满了
public boolean isFull(){
return (elems==maxSize);
}
//返回有效元素大小
public int size(){
return elems;
}
}
4、优先级队列
核心思想:数据项按关键字的值有序。关键字最小或最大的总在队头,数据项插入时会按照顺序插入到合适的位置,以确保队列的顺序。
public class TestQueue {
public static void main(String[] args) {
PriorityQueue queue=new PriorityQueue(10);
System.out.println(queue.isEmpty());//true
queue.insert(30);
queue.insert(10);
queue.insert(40);
queue.insert(1);
queue.insert(2);
while(!queue.isEmpty()){
System.out.print(queue.remove()+" ");
}
//1 2 10 30 40
}
}
public class PriorityQueue {
//数组
private long[] arr;
//最大空间
private int maxSize;
//有效元素大小
private int elems;
//构造函数
public PriorityQueue(int maxSize){
this.maxSize=maxSize;
arr=new long[maxSize];
elems=0;
}
//插入数据:从大到小排序,找比自己小的,移到其前
public void insert(long value){
int i;
for(i=0;i<elems;i++){
if(value>arr[i]){
break;//4插到5,3,1中:当4>3,i=1,brak
}
}
for(int j=elems;j>i;j--){
arr[j]=arr[j-1];//将3,1全部右移到arr[2],arr[3],空出arr[1]
}
arr[i]=value;//将4填到arr[1]
elems++;
}
//移除数据:先移除最小的
public long remove(){
long value=arr[elems-1];
elems--;
return value;
}
//是否为空
public boolean isEmpty(){
return (elems==0);
}
//是否满了
public boolean isFull(){
return (elems==maxSize);
}
//返回有效元素大小
public int size(){
return elems;
}
}
本文介绍了队列的基本概念,包括其先进先出的核心思想,并详细阐述了如何实现队列、循环队列以及优先级队列。优先级队列的特点是数据项按关键字有序,保证队头始终是最小或最大值。
798

被折叠的 条评论
为什么被折叠?



