封装一个整数数序(从小到大)类,支持同类型的两个整数数序列合并等操作。

  最近没什么心情看亚运,因为我不喜欢看那些没有悬念的比赛,所以花一些时间来写写代码。


  我想设计一个支持整数的数序类,除了最基本的特点以外(支持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);
};

  这几个方法都比较简单,我的思路是利用一个整数数组来实现的,其实大部分集合类归根到底都是采用数组去实现的。

这几个方法都是对数组的一些基本操作。

  再看看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];
}


    最核心的一部分要算是合并了,思路很简单。同时对两个序列进行循环,只要其中的某一个序列的数据被添加到新的数据序列中,则该序列的访问索引前进一位。循环完成之后,有可能其中一个序列的元素并未全问添加 ,此时只要把剩下的元素 添加就OK了。

   麻雀虽小,五脏俱全。以上只供参考!

posted @ 2010-11-14 13:18  Repository  阅读(512)  评论(0编辑  收藏  举报