二叉堆实现优先级队列Java

 1 public class PriQueue {
 2     private static final int DEFAULT_SIZE = 10;
 3     private int[] Q;
 4     private int qsize;
 5     private int top = -1;
 6 
 7     public PriQueue() {
 8         qsize = DEFAULT_SIZE;
 9         Q = new int[qsize];
10     }
11 
12     public PriQueue(int qsize) {
13         this.qsize = qsize;
14         Q = new int[qsize];
15     }
16 
17     public boolean isEmpty() {
18         return top < 0;
19     }
20 
21     public void push(int item) {
22         if (top >= qsize - 1) {
23             System.out.println("Queue is full");
24             return;
25         }
26         Q[++top] = item;
27         riseStack(Q, top);
28     }
29 
30     public int pop() {
31         if (top < 0) {
32             System.out.println("Queue is empty");
33             return Integer.MIN_VALUE;
34         }
35 
36         int retVal = Q[0];
37         Q[0] = Q[top--];
38         sinkStack(Q, 0, top + 1);
39         return retVal;
40     }
41 
42     @Override
43     public String toString() {
44         if (top < 0)
45             return new String("[]");
46 
47         StringBuilder strb = new StringBuilder("[");
48         int i = 0;
49         for (; i < top; i++) {
50             strb.append(Q[i] + ",");
51         }
52         strb.append(Q[i] + "]");
53 
54         return strb.toString();
55     }
56 
57 
58     private void riseStack(int[] arr, int index) {
59         int parent = (index - 1) / 2;
60         int temp = arr[index];
61         while (index != 0) {
62             if (temp > arr[parent]) {
63                 arr[index] = arr[parent];
64                 index = parent;
65                 parent = (index - 1) / 2;
66             } else
67                 break;
68         }
69         arr[index] = temp;
70     }
71     
72     private void sinkStack(int[] arr, int index, int stackSize) {
73         int left = 2 * index + 1;
74         int pValue = arr[index];
75         while (left < stackSize) {
76             if (left + 1 < stackSize)
77                 left = arr[left] > arr[left + 1] ? left : left + 1;
78             if (arr[left] > pValue) {
79                 arr[index] = arr[left];
80                 index = left;
81                 left = 2 * index + 1;
82             } else
83                 break;
84         }
85         arr[index] = pValue;
86     }
87 }
View Code

猜你喜欢

转载自www.cnblogs.com/endenvor/p/9283281.html