队列的基本知识和Java代码实现
我们之前说到了栈,它是一种比较高效的数据结构,遵循“先入后出”的原则。而今天我们要讨论的队列,它也是一种特殊的列表,与栈不同的是队列遵循先进先出的原则,只能在队尾插入元素,在队首删除元素,就像我们平时排队买票一样。队列用于很多地方,比如提交给操作系统的一系列进程,打印池任务等。
队列主要的操作有入队和出队方法,我们为了观察方便,给出了查看的方法,下面是队列的Java代码的实现:
- 代码实现:
package queue;
/**
* 队列算法实现
* @author leidada
*/
public class Queue {
private long[] queArray;
private int maxSize;
private int front,rear;//首、尾
private int nElems;
public Queue(int max){
maxSize = max;
queArray = new long[maxSize];
front = 0;
rear = -1;
nElems = 0;
}
//入队
public void insert(long value){
if(rear == (maxSize - 1))
rear = -1;
queArray[++rear] = value;
nElems++;
}
//出队
public long remove(){
long temp = queArray[front++];
if(front == maxSize)
front = 0;
nElems--;
return temp;
}
//显示所有
public long peekFront(){
return queArray[front];
}
//为空
public boolean isEmpty(){
return (nElems == 0);
}
//为满
public boolean isFull(){
return nElems == maxSize;
}
//显示数量
public int size(){
return nElems;
}
//显示所有
public void display(){
for(int j = 0; j<nElems; j++)
System.out.print(queArray[j]+" ");
System.out.println();
}
}
测试运行:
package queue;
/**
* 队列测试
* @author Administrator
*/
public class QueueApp {
public static void main(String[] args){
Queue queue = new Queue(5);
queue.insert(99);
queue.insert(98);
queue.insert(97);
queue.insert(96);
System.out.println(queue.isFull());
queue.insert(95);
System.out.println(queue.isFull());
//查看队首
queue.display();
queue.peekFront();
//出队
queue.remove();
queue.remove();
queue.remove();
queue.remove();
System.out.println(queue.isEmpty());
queue.remove();
System.out.println(queue.isEmpty());
}
}
优先队列原理与实现
优先级队列,比普通队列多了个优先级。如何来理解优先级呢?通俗来讲,优先级就相当于给了数组元素一个排序的规则,可以按元素大小从小到大或者从大到小排列,存放到数组中(这里可以理解成为有序数组),但有遵循队列的规则:先进先出。优先级高的排在队首,优先出队;优先级低的排在队尾,最后出队。
算法是这样的:
假设底层我们用的数据结构是数组(实际当中,使用堆较为合适)。同队列实现一样,不过我们不需要队尾指针。对于删除,直接删除队头,同时队头指针减一。对于插入,和有序数组插入一样,对比移动,查找到合适的插入位置,将值插入即可。
- 代码实现:
package priorityQueue;
/**
* 优先级队列
* @author Administrator
*/
public class PriorityQ {
private long[] queArray;
private int maxSize;
private int nItems;
public PriorityQ(int max){
maxSize = max;
queArray = new long[max];
nItems = 0;
}
//添加
public void insert(long value){
int j;//要加入的位置
if(nItems == 0){
queArray[nItems++] = value;
}
else if(isFull()){
System.out.println("queue is full");
return;
}else{
for(j = nItems-1; j>=0; j--){
if(value > queArray[j])
queArray[j+1] = queArray[j];
else
break;
}
queArray[++j] = value;
nItems++;
}
}
//移除
public long remove(){
return queArray[--nItems];
}
//查看队首
public long peekMin(){
return queArray[nItems-1];
}
//为空
public boolean isEmpty(){
return nItems ==0;
}
//为满
public boolean isFull(){
return nItems == maxSize;
}
//显示全部
public void display(){
for(int i = nItems-1 ; i>=0; i--)
System.out.print(queArray[i] + " ");
System.out.println();
}
}
测试代码:
package priorityQueue;
/**
* 优先级队列实现
* @author Administrator
*/
public class priorityQApp {
public static void main(String[] args){
PriorityQ queArray = new PriorityQ(5);
queArray.insert(100);
queArray.insert(99);
queArray.insert(96);
queArray.insert(98);
System.out.println(queArray.isFull());
queArray.insert(97);
queArray.insert(93);
queArray.insert(101);
System.out.println(queArray.isFull());
queArray.display();
queArray.remove();
queArray.remove();
queArray.display();
}
}