这个优先队列用heap实现,代码改编自CLRS(算法导论)。
#define
left(i) ((i) << 1)
#define right(i) (((i) << 1) + 1)
#define parent(i) ((i) >> 1)
#define swap(a, b) {T t = a; a = b; b = t;}
// 测试用的结构体
struct test
... {
int key;
string data;
test(int k, string d)
: key(k), data(d)
...{}
test()
...{}
//这个很重要
bool operator< (const test& b) const
...{
return (key < b.key);
}
} ;
// 优先队列的模板(最小优先队列)
// 用堆实现
// insert(T)插入类型为T的元素
// extract 返回类型为T的最小元素,并删除
// empty bool型,返回是否空
template < typename T >
class pri_queue
... {
private:
T* A;
int size;
void heapify(int i)
...{
int smallest = i, l = left(i), r = right(i);
if (l <= size && A[l] < A[i])
smallest = l;
if (r <= size && A[r] < A[smallest])
smallest = r;
if (i != smallest)
...{
swap(A[i], A[smallest]);
heapify(smallest);
}
}
public:
pri_queue(int len)
: size(0), A(new T[len+1])
...{}
inline bool empty()
...{
return (size == 0);
}
inline T extract()
...{
T min = A[1];;
A[1] = A[size--];
heapify(1);
return min;
}
inline void insert(const T& key)
...{
A[++size] = key;
int i = size;
while (i > 1 && A[i] < A[parent(i)])
...{
swap(A[i], A[parent(i)]);
i >>= 1;
}
}
inline T min()
...{
return A[1];
}
} ;
#define right(i) (((i) << 1) + 1)
#define parent(i) ((i) >> 1)
#define swap(a, b) {T t = a; a = b; b = t;}
// 测试用的结构体
struct test
... {
int key;
string data;
test(int k, string d)
: key(k), data(d)
...{}
test()
...{}
//这个很重要
bool operator< (const test& b) const
...{
return (key < b.key);
}
} ;
// 优先队列的模板(最小优先队列)
// 用堆实现
// insert(T)插入类型为T的元素
// extract 返回类型为T的最小元素,并删除
// empty bool型,返回是否空
template < typename T >
class pri_queue
... {
private:
T* A;
int size;
void heapify(int i)
...{
int smallest = i, l = left(i), r = right(i);
if (l <= size && A[l] < A[i])
smallest = l;
if (r <= size && A[r] < A[smallest])
smallest = r;
if (i != smallest)
...{
swap(A[i], A[smallest]);
heapify(smallest);
}
}
public:
pri_queue(int len)
: size(0), A(new T[len+1])
...{}
inline bool empty()
...{
return (size == 0);
}
inline T extract()
...{
T min = A[1];;
A[1] = A[size--];
heapify(1);
return min;
}
inline void insert(const T& key)
...{
A[++size] = key;
int i = size;
while (i > 1 && A[i] < A[parent(i)])
...{
swap(A[i], A[parent(i)]);
i >>= 1;
}
}
inline T min()
...{
return A[1];
}
} ;