标程:优先队列类

#include < algorithm >
// 本例程演示了STL heap的一个最重要的应用——实现优先队列。并将其方法封装到一个PQ类中

   const   int  maxLen = 100 ;
template
< class  T >
#define  DEAP  // 浅复制还是深复制
struct  PQ { // 最大堆
    T h[maxLen];
    
int  e;
    
void  clear() { e = 0 ;}
    
bool  empty() return  e == 0 ; }
    
int  size() return  e;}
    
void  push( const  T &  item) { // O(logN)
        h[e ++ ] = item;
        push_heap(h,h
+ e);
    }

    T
&  pop() { // O(logN)
        pop_heap(h,h + e);
        
return  h[ -- e];
    }

    
const  T &  top() {
        
return  h[ 0 ];
    }

    
void  make(T *  bgn, T *  end) { // O(N)
        #ifdef DEAP  // 深复制
             for (e = 0 ; bgn != end;  ++ e, ++ bgn)
                h[e]
=* bgn;
        
#else   // 浅复制
            e
= end - bgn;
            memcpy(h,bgn,e
* sizeof ( * bgn));
        
#endif
        make_heap(h,h
+ e);
    }

    
void  sort(T *  bgn) { // O(NlogN)
        #ifdef DEAP  // 深复制
             int  i; T *  end = bgn;
            
for (i = 0 ; i < e;  ++ i, ++ end)
                
* end = h[i];
        
#else   // 浅复制
            T
*  end = bgn + e;
            memcpy(bgn,h,e
* sizeof ( * bgn));
        
#endif
            sort_heap(bgn, end);
    }

    friend 
bool  isHeap(T *  bgn, T *  end) // debug用, O(N)
        T *  h = bgn - 1 int  i,e = end - bgn + 1 ;
        
for (i = 2 ; i < e;  ++ i)
            
if (h[i / 2 ] < h[i])  return   false ;
        
return   true ;
    }

    PQ()
{ clear();}
}
;

#include
< cassert >
#include
< iostream >
using   namespace  std;
template
< class  T >
inline 
void  show(T a[],  int  n) {
    
int  i;
    
for (i = 0 ; i < n;  ++ i)
        cout
<< a[i] << '   ' ;
    cout
<< endl;
}


// 简单测试        
int  main() {
    PQ
< int >  pq;
    
int  a[] = { 3 , 6 , 5 , 4 , 2 , 7 , 9 } ;
    cout
<< (pq.empty()  ?   " Empty/n "  :  " Not empty/n " );
    pq.make(a,a
+ sizeof (a) / sizeof ( * a));
    show(pq.h,pq.size());
    cout
<< " Top:  " << pq.top() << endl;
    cout
<< ( isHeap(pq.h, pq.h + pq.e)  ?   " Is heap/n "  :  " Not a heap/n "  );
    pq.push(
3 );
    pq.push(
1 );
    pq.push(
10 );
    show(pq.h,pq.size());
    cout
<< " Top:  " << pq.top() << endl;
    cout
<< ( isHeap(pq.h, pq.h + pq.e)  ?   " Is heap/n "  :  " Not a heap/n "  );
    cout
<< " Pop: " << pq.pop() << endl;
    cout
<< " Pop: " << pq.pop() << endl;
    cout
<< " Pop: " << pq.pop() << endl;
    pq.sort(a);
    show(a,pq.size());
    
return   0 ;
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值