①、单向队列(Queue):只能在一端插入数据,另一端删除数据。
②、双向队列(Deque):每一端都可以进行插入数据和删除数据操作。
1.Java模拟单向队列实现
1 public class MyQueue { 2 private Object[] queueArray; 3 private int maxSize; //队列总大小 4 private int front; //队列前端 5 private int rear; //队列后端 6 private int nItems; //队列实际数目 7 8 public MyQueue(int size){ 9 maxSize=size; 10 queueArray=new Object[maxSize]; 11 front=0; 12 rear=-1; 13 nItems=0; 14 } 15 16 //查看对头数据 17 public Object peekFront(){ 18 return queueArray[front]; 19 } 20 21 //判断队列是否满了 22 public boolean isFull(){ 23 return (nItems==maxSize); 24 } 25 26 //判断队列是否为空 27 public boolean isEmpt(){ 28 return (nItems==0); 29 } 30 31 //返回队列的大小 32 public int getSize(){ 33 return nItems; 34 } 35 36 //队列中新增数据 37 public void insert(int value){ 38 if (isFull()){ 39 System.out.println("队列已满!"); 40 }else { 41 if (rear==maxSize-1){ 42 rear=-1; //队尾元素已满,循环回来 43 } 44 queueArray[++rear]=value; 45 nItems++; 46 } 47 } 48 49 //移除数据 50 public Object remove(){ 51 Object removeValue=null; 52 if (!isEmpt()){ 53 removeValue=queueArray[front]; 54 queueArray[front]=null; 55 front++; //队头元素移除后,指针往上移动 56 if (front==maxSize){ 57 front=0; 58 } 59 nItems--; 60 return removeValue; 61 } 62 return removeValue; 63 } 64 65 }
Test:
1 public class MyQueueTest { 2 public static void main(String[] args) { 3 MyQueue queue = new MyQueue(3); 4 queue.insert(5); 5 queue.insert(3); 6 queue.insert(8);//插入数据 7 System.out.println(queue.peekFront());//对头数据 8 queue.remove(); //移除数据 9 System.out.println(queue.peekFront()); 10 queue.insert(4); 11 queue.insert(0); //此时队列已满 12 } 13 }
优先级队列 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有:
(1)查找
(2)插入一个新元素
(3)删除
1 public class PriQueue { 2 private int maxSize; 3 private int[] priQueueArray; 4 private int nItems; 5 6 public PriQueue(int size) { 7 maxSize=size; 8 priQueueArray=new int[maxSize]; 9 nItems=0; 10 } 11 12 //插入数据 13 //选择的排序方法是插入排序,按照从大到小的顺序排列,越小的越在队列的顶端(下标nItem-1) 14 public void insert(int value){ 15 int j; //定义j是为了插入排序使用 16 if (nItems==0){ 17 priQueueArray[nItems++]=value; 18 }else { 19 j=nItems-1; //定义j为当前最小数,即插入数value的前一项 20 while (j>=0&&value>priQueueArray[j]){ 21 priQueueArray[j+1]=priQueueArray[j]; 22 j--; 23 } 24 priQueueArray[j+1]=value; 25 nItems++; 26 } 27 } 28 29 //移除数据,由于是按照大小排序的,所以移除数据我们指针向下移动 30 //被移除的地方由于是int类型的,不能设置为null,这里的做法是设置为 -1 31 public int remove(){ 32 int k=nItems-1; 33 int value=priQueueArray[k]; 34 priQueueArray[k]=-1; //-1表示这个位置的数据被移除了 35 nItems--; 36 return value; 37 } 38 39 //查看优先级最高的元素 40 public int peekMax(){ 41 return priQueueArray[nItems-1]; 42 } 43 44 //判断是否为空 45 public boolean isEmpt(){ 46 return (nItems==0); 47 } 48 49 //判断是否满了 50 public boolean isFull(){ 51 return (nItems==maxSize); 52 } 53 54 }
Test:
1 public class PriQueueTest { 2 public static void main(String[] args) { 3 PriQueue priQueue = new PriQueue(5); 4 priQueue.insert(15); 5 priQueue.insert(26); 6 priQueue.insert(18); 7 priQueue.insert(3); 8 priQueue.insert(32); 9 System.out.println("队列是否满了?"+priQueue.isFull()); 10 11 System.out.println(priQueue.remove()); 12 System.out.println(priQueue.remove()); 13 System.out.println(priQueue.remove()); 14 System.out.println(priQueue.remove()); 15 System.out.println(priQueue.remove()); 16 17 System.out.println("队列是否满了?"+priQueue.isFull()); 18 System.out.println("队列是否为空?"+priQueue.isEmpt()); 19 } 20 }