封装一个整数数序(从小到大)类,支持同类型的两个整数数序列合并等操作。
最近没什么心情看亚运,因为我不喜欢看那些没有悬念的比赛,所以花一些时间来写写代码。
我想设计一个支持整数的数序类,除了最基本的特点以外(支持add,remove,get,display)以外,最大的特点可以进行同类数序的合并。该数序暂时只支持升序。
其实.net框架中已有很多集合类支持Union合并操作,比如List类。
我决定用c++语言来实现它。
集合命名为:AscNumSequence,先看看头文件的定义:
//maxlength of sequence
const int MAX = 500;
class AscNumSequence
{
public:
int count;
int num[MAX];
public:
//contructor
AscNumSequence();
//add element
void Add(int number);
//remove element at specified index
void Remove(int index);
//output element to console
void Display();
//get element at specified index
int Get(int index);
//collection union
AscNumSequence Union(AscNumSequence seq1,AscNumSequence seq2);
};
const int MAX = 500;
class AscNumSequence
{
public:
int count;
int num[MAX];
public:
//contructor
AscNumSequence();
//add element
void Add(int number);
//remove element at specified index
void Remove(int index);
//output element to console
void Display();
//get element at specified index
int Get(int index);
//collection union
AscNumSequence Union(AscNumSequence seq1,AscNumSequence seq2);
};
这几个方法都比较简单,我的思路是利用一个整数数组来实现的,其实大部分集合类归根到底都是采用数组去实现的。
这几个方法都是对数组的一些基本操作。
再看看CPP文件的实现。
#include <iostream.h>
#include "AscNumSequence.h"
AscNumSequence::AscNumSequence()
{
count = 0;
}
void AscNumSequence::Add(int number)
{
if(count > MAX) return;
int position = 0;
//找出要插入数据的位置
while(number > num[position] && position < count)
{
position++;
}
//有重复的数据
if(number == num[position])
{
return;
}
//Position之后的所有元素后移一个位置
for(int pos = count; pos >= position; pos--)
{
num[pos] = num[pos-1];
}
//插入number
num[position] = number;
count = count +1;
}
//移除指定索引处的元素
void AscNumSequence::Remove(int index)
{
if(index > count - 1)
{
return;
}
//从index开始之后的元素前移一位
for(int i = index; i<count-1; i++)
{
num[i] = num[i+1];
}
}
AscNumSequence AscNumSequence::Union(AscNumSequence seq1,AscNumSequence seq2)
{
AscNumSequence seq3;
//分别表示两个数据的查找索引
int i =0,j = 0;
while(i<seq1.count && j<seq2.count)
{
int num1 = seq1.Get(i);
int num2 = seq2.Get(j);
if(num1 < num2)
{
seq3.Add(num1);
i++; //数据序列1前进到下一位
}
else if(num1 > num2)
{
seq3.Add(num2);
j++; //数据序列2前进到下一位
}
else
{
seq3.Add(num1);
i++; //二个数据序列同时前进到下一位
j++;
}
}
//添加数据序列1当中还未添加的元素
while(i<seq1.count)
{
seq3.Add(seq1.Get(i));
i++;
}
//添加数据序列2当中还未添加的元素
while(j<seq2.count)
{
seq3.Add(seq2.Get(j));
j++;
}
//返回已排序的合并的序列
return seq3;
}
void AscNumSequence::Display()
{
for(int index=0; index<count; index++)
{
cout << num[index] << " ";
}
cout << endl;
}
int AscNumSequence::Get(int index)
{
return num[index];
}
#include "AscNumSequence.h"
AscNumSequence::AscNumSequence()
{
count = 0;
}
void AscNumSequence::Add(int number)
{
if(count > MAX) return;
int position = 0;
//找出要插入数据的位置
while(number > num[position] && position < count)
{
position++;
}
//有重复的数据
if(number == num[position])
{
return;
}
//Position之后的所有元素后移一个位置
for(int pos = count; pos >= position; pos--)
{
num[pos] = num[pos-1];
}
//插入number
num[position] = number;
count = count +1;
}
//移除指定索引处的元素
void AscNumSequence::Remove(int index)
{
if(index > count - 1)
{
return;
}
//从index开始之后的元素前移一位
for(int i = index; i<count-1; i++)
{
num[i] = num[i+1];
}
}
AscNumSequence AscNumSequence::Union(AscNumSequence seq1,AscNumSequence seq2)
{
AscNumSequence seq3;
//分别表示两个数据的查找索引
int i =0,j = 0;
while(i<seq1.count && j<seq2.count)
{
int num1 = seq1.Get(i);
int num2 = seq2.Get(j);
if(num1 < num2)
{
seq3.Add(num1);
i++; //数据序列1前进到下一位
}
else if(num1 > num2)
{
seq3.Add(num2);
j++; //数据序列2前进到下一位
}
else
{
seq3.Add(num1);
i++; //二个数据序列同时前进到下一位
j++;
}
}
//添加数据序列1当中还未添加的元素
while(i<seq1.count)
{
seq3.Add(seq1.Get(i));
i++;
}
//添加数据序列2当中还未添加的元素
while(j<seq2.count)
{
seq3.Add(seq2.Get(j));
j++;
}
//返回已排序的合并的序列
return seq3;
}
void AscNumSequence::Display()
{
for(int index=0; index<count; index++)
{
cout << num[index] << " ";
}
cout << endl;
}
int AscNumSequence::Get(int index)
{
return num[index];
}
最核心的一部分要算是合并了,思路很简单。同时对两个序列进行循环,只要其中的某一个序列的数据被添加到新的数据序列中,则该序列的访问索引前进一位。循环完成之后,有可能其中一个序列的元素并未全问添加 ,此时只要把剩下的元素 添加就OK了。
麻雀虽小,五脏俱全。以上只供参考!
Author:repository
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
From: http://repository.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。