①、单向队列(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 }

 

posted on 2018-08-23 14:53  蓝绿绿  阅读(127)  评论(0编辑  收藏  举报