一个range的序列(链表或数组),如[1,3], [2,6], [8,10],[15,18] 写程序合并有重叠的range,
比如上面的序列合并为[1,6], [8,10], [15,18] 如果这个序列不是静态的,而是一个数据流,如何 处理?
main.cpp
/* 一个range的序列(链表或数组)
**如[1,3], [2,6], [8,10],[15,18]
**写程序合并有重叠的range
**比如上面的序列合并为[1,6], [8,10], [15,18]
*/
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
#include "RangeMerger.h"
#define MAX_CNT = 10000
#define OP_INSERT "insert"
#define OP_DELETE "delete"
#define OP_PRINT "print"
#define OP_EXIT "exit"
int main(){
RangeMerger rangeMerger;
int left, right;
char op[256];
while (true){
printf("please input operaton(\"insert\"、\"delete\"、\"print\" or \"exit\"):");
scanf("%s", op);
if (strcmp(op, OP_INSERT)==0){
printf("please input var left and right:");
scanf("%d", &left);
scanf("%d", &right);
try{
rangeMerger.insertRange(left, right);
}catch (RangeException *e){
printf("error:%s\n",e->what());
}
}
else if (strcmp(op, OP_DELETE) == 0){
printf("please input var left and right:");
scanf("%d", &left);
scanf("%d", &right);
try{
rangeMerger.deleteRange(left, right);
}
catch (RangeException *e){
e->what();
}
}
else if (strcmp(op, OP_PRINT) == 0){
rangeMerger.print();
}
else if (strcmp(op, OP_EXIT)==0){
break;
}
else{
}
}
return 0;
}
RangeMerger.h
#ifndef RangeMerger_H
#define RangeMerger_H
#include <cstdio>
#include <cstdlib>
#include <exception>
using namespace std;
#define RangeMerger_Max_Cnt 10000
/*错误区间异常*/
class RangeException : public exception{
private:
int left, right;/*该错误区间的左端点和右端点*/
public:
RangeException(int left, int right);
const char* what() const throw(); /*获取错误信息字符串*/
static bool isIncorrectRange(int left, int right); /*检查区间是否为错误区间*/
};
/*线段树节点*/
struct RangeMergerNode{
bool isFullFilled; /*该区间是否被填满*/
int left, right; /*该区间的左端点和右端点*/
RangeMergerNode *leftNode, *rightNode; /*节点的左孩子和右孩子的指针*/
RangeMergerNode(int left,int right);
~RangeMergerNode();
};
class RangeMerger{
private:
RangeMergerNode *head; /*线段树的头指针*/
RangeMergerNode *printTemp; /*辅助打印线段树的指针,用于指向为了连接两个区间而产生的临时节点或上一个预打印节点*/
bool newTemp; /*辅助打印线段树的标记,标记printTemp指针指向的对象是否为临时节点*/
void init(); /*初始化过程*/
void buildTree(RangeMergerNode *&node, int left, int right); /*递归构造线段树*/
void insertRangeHelp(RangeMergerNode *node, int left, int right); /*插入区间的递归辅助函数*/
void deleteRangeHelp(RangeMergerNode *node, int left, int right); /*删除区间的递归辅助函数*/
void printHelp(RangeMergerNode *node); /*打印线段树的递归辅助函数*/
public:
RangeMerger();
~RangeMerger();
void insertRange(int left, int right) throw(RangeException); /*客户端调用的插入区间函数*/
void deleteRange(int left, int right) throw(RangeException); /*客户端调用的删除区间函数*/
void print();
};
#endif
RangeMerger.cpp
#ifndef RangeMerger_H
#define RangeMerger_H
#include <cstdio>
#include <cstdlib>
#include <exception>
using namespace std;
#define RangeMerger_Max_Cnt 10000
/*错误区间异常*/
class RangeException : public exception{
private:
int left, right;/*该错误区间的左端点和右端点*/
public:
RangeException(int left, int right);
const char* what() const throw(); /*获取错误信息字符串*/
static bool isIncorrectRange(int left, int right); /*检查区间是否为错误区间*/
};
/*线段树节点*/
struct RangeMergerNode{
bool isFullFilled; /*该区间是否被填满*/
int left, right; /*该区间的左端点和右端点*/
RangeMergerNode *leftNode, *rightNode; /*节点的左孩子和右孩子的指针*/
RangeMergerNode(int left,int right);
~RangeMergerNode();
};
class RangeMerger{
private:
RangeMergerNode *head; /*线段树的头指针*/
RangeMergerNode *printTemp; /*辅助打印线段树的指针,用于指向为了连接两个区间而产生的临时节点或上一个预打印节点*/
bool newTemp; /*辅助打印线段树的标记,标记printTemp指针指向的对象是否为临时节点*/
void init(); /*初始化过程*/
void buildTree(RangeMergerNode *&node, int left, int right); /*递归构造线段树*/
void insertRangeHelp(RangeMergerNode *node, int left, int right); /*插入区间的递归辅助函数*/
void deleteRangeHelp(RangeMergerNode *node, int left, int right); /*删除区间的递归辅助函数*/
void printHelp(RangeMergerNode *node); /*打印线段树的递归辅助函数*/
public:
RangeMerger();
~RangeMerger();
void insertRange(int left, int right) throw(RangeException); /*客户端调用的插入区间函数*/
void deleteRange(int left, int right) throw(RangeException); /*客户端调用的删除区间函数*/
void print();
};
#endif