优先队列

优先队列的实现

  优先队列是拥有权值观念的队列,它允许加入新元素,移除旧元素、审视元素值等功能。由于这是一个queue,所以只允许在底端加入元素,并从顶端取出元素,除此之外无其他存取元素的途径。

  优先队列带有权值观念,其内的元素并非按照被推入的次序排列,而是自动依照元素的权值排列(通常权值以实值表示)。权值最高者,排在最前面

 1 #include<cstddef> //std::size_t
 2 #include<algorithm> //std::swap
 3 #include<vector>
 4 
 5 template<typename T> class PriorityQueue {
 6 public:
 7     PriorityQueue(){}
 8 
 9     bool empty() {
10         return data.empty();
11     }
12 
13     size_t size() {
14         return data.size();
15     }
16 
17     T& top() {
18         return data.front();
19     }
20 
21     void push(const T& val) {
22         data.push_back(val);
23         push_heap();
24     }
25 
26     void pop() {
27         if (data.empty())
28             return;
29 
30         pop_heap();
31         data.pop_back();
32     }
33 
34 private:
35     void push_heap() {
36         int i = data.size() - 1;
37         T temp = data[i];
38 
39         for (; i > 0 && temp > data[(i-1) / 2]; (i-1) /= 2) {
40             data[i] = data[(i-1) / 2];
41         }
42 
43         data[i] = temp;
44     }
45 
46     void pop_heap() {
47         std::swap(data[0], data[data.size() - 1]);
48         int heap_end = data.size() - 2;
49 
50         percolatedown(0, heap_end);
51     }
52 
53     void percolatedown(int i, int heap_end) {
54         T temp = data[i];
55 
56         for (int child = 2 * i + 1; child <= heap_end; child = 2 * child + 1) {
57             if (child < heap_end && data[child] < data[child + 1])
58                 ++child;
59 
60             if (temp < data[child]) {
61                 data[i] = data[child];
62                 i = child;
63             } else {
64                 break;
65             }
66         }
67 
68         data[i] = temp;
69     }
70 
71     std::vector<T> data;
72 };

 

posted @ 2015-01-02 18:33  vincently  阅读(345)  评论(0编辑  收藏  举报