败者树的实现(c++)

这是一个关于如何使用C++实现败者树的博客,包括败者树的定义、模板类Buffer的实现以及败者树类LoserTree的详细操作,如初始化、重构和比赛过程。通过败者树可以实现多路归并算法,处理多个有序序列的合并问题。
摘要由CSDN通过智能技术生成

#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>

#define MAX_BUFFER 512 //buffer最大容量
#define NO_MEANING 99999999 //当某顺串已经全部处理完时,给败方树外部节点填充这个超大值
#define MAX 10 //最大选手数目


/********************* 缓冲区类,用环状数组实现的队列来实现之 ********************/
//设置头指针front,尾指针rear
//插入在rear处,删除在front处
template <class Elem> class Buffer{
 
 private:
  Elem * buf; //存放元素的数组
  int front, rear;
  int n; //buffer中当前元素的数目
 
 public:
  
  //constructor
  Buffer(){
   buf = new Elem [MAX_BUFFER];
   front = 0;
   rear = 0;
   n = 0;
   
  }

  //destructor
  ~Buffer(){
  delete buf;
  }

  //判断buffer是否为空
  bool isEmpty(){
   return (n==0);
  }

  //判断buffer是否满
  bool isFull(){
   return (n==MAX_BUFFER);
  }
  
  //列出buffer中所有的元素
  //假设元素类型为内建类型
  void list(){
   if (isEmpty()){
    cout<<"no data!"<<endl<<endl;
    return;
   }

   int temp = front;
   for(int i = 0; i < n; i++){
    cout<<buf[temp % MAX_BUFFER]<<"  ";
    temp++;
   }
   cout<<endl<<endl;
  }
  
  //往buffer中插入元素x
  bool insert(Elem x){
   if(isFull()==false){//非满
   buf[rear] = x;
   rear = (rear+1)%MAX_BUFFER;
   n++;
   return true;
   }
   else{
    cout<<"BUFFER FULL!"<<endl;
    return false;
   }
  }

  //从buffer中读取元素x,并在buffer中删除它
  bool read(Elem & x){
   if(isEmpty()==false){//非空
    x = buf[front];
    front = (front+1)%MAX_BUFFER;
    n--;
    return true;
   }
   else{
    cout<<"BUFFER EMPTY!"<<endl;
    return false;
   }
  }

  void flush(FILE  * outputFile){
   
   //写入输出文件
   int temp = front;
   for(int i = 0; i < n; i++){
    fprintf(outputFile,"%d ", buf[temp % MAX_BUFFER]);
    //cout<<buf[temp % MAX_BUFFER]<<"  ";
    temp++;
   }

   //清零
   n = 0;
   front = 0;
   rear = 0;
  }

};


/******** 全局Winner函数&#x

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值