文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>封装一个整数数序(从小到大)类,支持同类型的两个整数数序列合并等操作。

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

时间:2010-11-14  来源:Repository


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

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

相关阅读 更多 +
排行榜 更多 +
边境检察最后区域手机版下载

边境检察最后区域手机版下载

角色扮演 下载
酋长你别跑手游下载

酋长你别跑手游下载

休闲益智 下载
心动漫画app下载官方版

心动漫画app下载官方版

浏览阅读 下载