zoukankan      html  css  js  c++  java
  • 封装一个整数数序(从小到大)类,支持同类型的两个整数数序列合并等操作。

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


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

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

    Author:repository
    From:  http://repository.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    saveField方法
    cake使用事务的方法
    css 中引用css的方法
    一次标准的关联查询
    try cath用处
    使用其他模型分页$data = $this>paginate('MerchantProductOrder');
    jquery 常用代码
    php 邮箱验证原理
    cake 分页一个典型的条件
    一次典型的查询
  • 原文地址:https://www.cnblogs.com/repository/p/1876944.html
Copyright © 2011-2022 走看看