集合的模拟实现

1、题目(函数模板)

我们可以用一个数组来模拟集合,add运算用以实现集合元素的增加,delete运算用于实现集合元素的删除,find运算用以实现集合元素的查找,但是目前集合元素类型未知,可以是int、char、double等基本数据类型,也可以是String、Time、Student等对象类型,要求采用模板函数实现集合元素的增加、删除和查找功能。

三个模板函数如下:

int addSet(T * myset, T elem,int len)

int deleSet(T * myset, T elem, int len)

int findElem(T * myset, T elem, int len)

其中,addSet向集合中添加一个元素,deleSet从集合中删除一个元素,findElem判断elem是否是集合成员,三个函数分别返回元素插入位置,删除位置和存在位置。

主函数有如下数据成员 :

int intSet[100]

double douSet[100]

String StrSet[100] 分别是int类型、double类型、String的数组集合。

int intLen, douLen, strLen分别是int类型、double类型、String的数组集合的长度

完成上述函数模板和主函数,主函数根据输入的信息,建立初始的空集合,调用三个模板函数分别对intSet、douSet和StrSet执行相应的操作,并输出对应的集合信息。

输入格式:

每一行为一个集合操作,每行的第一个数字为集合元素类型,1为整型元素,2为浮点型元素,3为String类型,第二个数字为集合操作类型,1为插入,2为删除,3为查找,第三个为集合元素,集合元素类型视第一个数字给定的集合元素类型而定。输入0时标志输入结束。

输出格式:

输出当前操作的执行位置(插入位置、删除位置和存在位置)

删除操作时,如果元素X不存在,输出“X is not exist!”。

插入操作时,如果集合已满,输出“Full Set.”若元素已存在,输出“X is already exist!”

查找操作时,如果找不到元素,输出“X is not exist!”。

输入:

1 1 1

1 1 2

1 3 1

1 2 1

1 2 3

1 3 1

2 1 1.1

2 1 2.2

2 1 3.3

2 3 1.1

2 2 2.2

2 2 2.2

3 1 abc

3 1 bcd

3 3 abc

3 2 abc

3 3 abc

0

输出:

0

1

0

0

3 is not exist!

1 is not exist!

0

1

2

0

1

2.2 is not exist!

0

1

0

0

abc is not exist!

2、代码(函数模板)

#include<iostream>
#include<string>
using namespace std;
template <class T>
int addSet(T *myset, T elem,int len)
{
    bool flag=false;
    for(int i=0; i<=len; i++)
    {
        if(elem==myset[i]&&len!=i)
        {
            flag=true;
            break;
        }
    }
    if(flag==true)
    {
        cout<<elem<<" is already exist!"<<endl;
    }
    else if(flag==false)
    {
        myset[len]=elem;
        cout<<len<<endl;
        len++;
    }
    return len;
}

template <class T>
int deleSet(T * myset, T elem, int len)
{
    bool flag=false;
    int i=0;
    for(i=0; i<len; i++)
    {
        if(myset[i]==elem)
        {
            flag=true;

            break;
        }
    }
    if(flag==true)
    {
        cout<<i<<endl;
        for(int j=i; j<len-1&&len>1; j++)
        {
            myset[j]=myset[j+1];
        }

    }
    else
    {
        cout<<elem<<" is not exist!"<<endl;
    }

    return i;
}

template <class T>
int findElem(T * myset, T elem, int len)
{
    int i=0;
    bool flag=false;
    for(i=0; i<len; i++)
    {
        if(myset[i]==elem)
        {
            flag=true;
            cout<<i<<endl;
            break;
        }
    }
    if(flag==false)
    {
        cout<<elem<<" is not exist!"<<endl;
    }
    return i;
}

int main()
{
    int intSet[100] ;

    double douSet[100];

    string StrSet[100] ;
    int temp,ch;
    int intLen=0, douLen=0, strLen=0;
    while(cin>>ch)
    {
        if(ch==0)
        {
            break;
        }
        if(ch==1)
        {
            cin>>temp>>intSet[intLen];
            if(temp==1)
            {
            intLen=addSet(intSet,intSet[intLen],intLen);
                
            }
            if(temp==2)
            {
                deleSet(intSet, intSet[intLen], intLen);
                intLen--;
                if(intLen<0)
                {
                    intLen=0;
                }
            }
            if(temp==3)
            {
                findElem(intSet, intSet[intLen], intLen);
            }

        }
        if(ch==2)
        {
            cin>>temp>>douSet[douLen];
            if(temp==1)
            {
                douLen=addSet(douSet, douSet[douLen], douLen);
            }
            if(temp==2)
            {
                deleSet(douSet, douSet[douLen], douLen);
                douLen--;
                if(douLen<0)
                {
                    douLen=0;
                }
            }
            if(temp==3)
            {
                findElem(douSet, douSet[douLen], douLen);
            }

        }
        if(ch==3)
        {
            cin>>temp>>StrSet[strLen];
            if(temp==1)
            {
                strLen=addSet(StrSet,StrSet[strLen],strLen);
            }
            if(temp==2)
            {
                deleSet(StrSet,StrSet[strLen],strLen);
                strLen--;
                if(strLen<0)
                {
                    strLen=0;
                }
            }
            if(temp==3)
            {
                findElem(StrSet,StrSet[strLen],strLen);
            }

        }
    }
    return 0;
}

3、题目(类模板)

我们可以用一个类来模拟集合及集合运算,add运算用以实现集合元素的增加,delete运算用于实现集合元素的删除,find运算用以实现集合元素的查找,但是目前集合元素类型未知,可以是int、char、double等基本数据类型,也可以是String、Time、Student等对象类型,要求采用类模板实现集合及集合运算,包括集合元素的增加、删除和查找的等基本功能。

集合模板类MySet包括数据如下:

T data[100];//用数组来存放所有的集合元素,最多不超过100个元素

int count;//表示目前集合中有多少个元素

包括成员函数如下:

构造函数若干个,集合运算函数如下:

int addSet( T elem)

int deleSet(T elem)

int findElem(T elem)

其中,addSet向集合中添加一个元素,deleSet从集合中删除一个元素,findElem判断elem是否是集合成员,三个函数分别返回元素插入位置,删除位置和存在位置。

主函数有如下数据成员 :

MySet<\int> intSet;(反斜杠是转义字符,使用时去掉)

MySet<\double> douSet;

MySet<\string> strSet;

分别是int类型、double类型、String的集合。

完成上述类模板和主函数,主函数根据输入的信息,建立初始的三种不同类型的空集合对象,调用成员函数分别对intSet、douSet和StrSet执行相应的操作,并输出对应的集合信息。

输入格式:

每一行为一个集合操作,每行的第一个数字为集合元素类型,1为整型元素,2为浮点型元素,3为String类型,第二个数字为集合操作类型,1为插入,2为删除,3为查找,第三个为集合元素,集合元素类型视第一个数字给定的集合元素类型而定。输入0时标志输入结束。

输出格式:

输出当前操作的执行位置(插入位置、删除位置和存在位置)

删除操作时,如果元素X不存在,输出“X is not exist!”。

插入操作时,如果集合已满,输出“Full Set.”若元素已存在,输出“X is already exist!”

查找操作时,如果找不到元素,输出“X is not exist!”。

输入:

1 1 1

1 1 2

1 3 1

1 2 1

1 2 3

1 3 1

2 1 1.1

2 1 2.2

2 1 3.3

2 3 1.1

2 2 2.2

2 2 2.2

3 1 abc

3 1 bcd

3 3 abc

3 2 abc

3 3 abc

0

输出:

0

1

0

0

3 is not exist!

1 is not exist!

0

1

2

0

1

2.2 is not exist!

0

1

0

0

abc is not exist!

4、代码(类模板)

#include<iostream>
#include<string>
using namespace std;
template <class T>
class MySet
{
    private:
        T data[100];
        int count;
    public:
        void set(T a,int len)
        {
            data[len]=a;
            count=len;
        }
        void de(int l)
        {
            count=l;
        }
        int addSet( T elem);

        int deleSet(T elem);

        int findElem(T elem);
};

template <class T>
int MySet<T>::addSet(T elem)
{

    bool flag=false;
    if(count>99)
    {
        cout<<"Full Set."<<endl;
    }
    else
    {
        for(int i=0; i<=count; i++)
        {
            if(elem==data[i]&&count!=i)
            {
                flag=true;
                break;
            }
        }
        if(flag==true)
        {
            cout<<elem<<" is already exist!"<<endl;
        }
        else if(flag==false)
        {
            data[count]=elem;
            cout<<count<<endl;
            count++;
        }
    }
    return count;
}

template <class T>
int MySet<T>::deleSet(T elem)
{
    bool flag=false;
    int i=0;
    for(i=0; i<count; i++)
    {
        if(data[i]==elem)
        {
            flag=true;
            break;
        }
    }
    if(flag==true)
    {
        cout<<i<<endl;
        for(int j=i; j<count-1&&count>1; j++)
        {
            data[j]=data[j+1];
        }
    }
    else
    {
        cout<<elem<<" is not exist!"<<endl;
    }
    return i;
}

template<class T>
int MySet<T>::findElem(T elem)
{
    int i=0;
    bool flag=false;
    for(i=0; i<count; i++)
    {
        if(data[i]==elem)
        {
            flag=true;
            cout<<i<<endl;
            break;
        }
    }
    if(flag==false)
    {
        cout<<elem<<" is not exist!"<<endl;
    }
    return i;
}

int main()
{
    MySet<int> intSet;

    MySet<double> douSet;

    MySet<string> strSet;
    int ints;
    double dou;
    string str;
    int ch,temp;
    int i=0,j=0,t=0;
    while(cin>>ch)
    {
        if(ch==0)
        {
            break;
        }
        
        if(ch==1)
        {
            cin>>temp>>ints;
            
            if(temp==1)
            {
                intSet.set(ints,i);
                i=intSet.addSet(ints);
            }
            
            if(temp==2)
            {
                intSet.de(i);
                intSet.deleSet(ints);
                i--;
                if(i<0)
                {
                    i=0;
                }
            }
            
            if(temp==3)
            {
                intSet.de(i);
                intSet.findElem(ints);
            }
        }
        
        if(ch==2)
        {
            cin>>temp>>dou;
            
            if(temp==1)
            {
                douSet.set(dou,j);
                j=douSet.addSet(dou);
            }
            
            if(temp==2)
            {
                douSet.de(j);
                douSet.deleSet(dou);
                j--;
                if(j<0)
                {
                    j=0;
                }
            }
            
            if(temp==3)
            {
                douSet.de(j);
                douSet.findElem(dou);
            }
        }
        
        if(ch==3)
        {
            cin>>temp>>str;
            
            if(temp==1)
            {
                strSet.set(str,t);
                t=strSet.addSet(str);
            }
            
            if(temp==2)
            {
                strSet.de(t);
                strSet.deleSet(str);
                t--;
                if(t<0)
                {
                    t=0;
                }
            }
            
            if(temp==3)
            {
                strSet.de(t);
                strSet.findElem(str);
            }
            
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/laixiaolian/p/5676588.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值