7-12 集合的模拟实现(函数模板) (40分) pta c++

我们可以用一个数组来模拟集合,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!

#include <iostream>
using namespace std;

template<typename T>
int existElem(T * myset, T elem, int len){
    
    for(int i=0;i<len;i++){
        
        if(myset[i]==elem)return 1;
        
    }
    
    return 0;
    
}

template<typename T>
int addSet(T * myset, T elem, int& len){
    if(len>=99){
        
        cout<<"Full Set."<<endl;
        
    }else if(existElem(myset, elem, len+1)){
        
        cout<<elem<<" is already exist!"<<endl;
        
    }else {
        myset[len]=elem;
        cout<<len<<endl;
        len++;
    }
}

template<typename T>
int deleSet(T * myset, T elem, int &len){
    if(!existElem( myset, elem,  len+1)){
        
        cout<<elem<<" is not exist!"<<endl;
        
    }else if(len>0){
        
        
        for(int i=0;i<len;i++){
        
            if(myset[i]==elem){
                
                cout<<i<<endl; 
                
                for(int j=i;j+1<=len;j++){
                    
                    myset[j]=myset[j+1];
                    
                }
                
            }
        
        }
        
        len--;
        
    }
    
}

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



int main(){
    int intSet[100];

    double douSet[100];

    string StrSet[100];
    
    int intLen=0, douLen=0, strLen=0;
    
    int type;
    
    int op;
    
    while(1){
        
        cin>>type;
        
        if(type==0)break;
        
        cin>>op;
        
        if(type==1){
            
            int elem;
            
            cin>>elem;
            
            if(op==1){
                
                    
                addSet(intSet, elem, intLen);
                
            }
            
            else if(op==2){
                
                deleSet(intSet, elem, intLen);
                
            }
            
            else{
                
                findElem(intSet, elem, intLen);
                
            }
             
        }
        
        else if(type==2){
            
            double elem;
            
            cin>>elem;
            
            if(op==1){
                    
                addSet(douSet, elem, douLen);
                
            }
            
            else if(op==2){
                
                
                deleSet(douSet, elem, douLen);
                
            }
            
            else{
                
                findElem(douSet, elem, douLen);
                
            }
        
        }
        
        else{
            
            string elem;
            
            cin>>elem;
            
            if(op==1){
                
                    
                addSet(StrSet, elem, strLen);
                
            }
            
            else if(op==2){
                
                deleSet(StrSet, elem, strLen);
                
            }
            
            else{
                
                findElem(StrSet, elem, strLen);
                
            }
            
        }
        
        
    }
    
    return 0;
}

 

 对于 0号和3号测试点要注意极限的情况(例如fullset

posted on 2020-08-05 18:13  xwwer  阅读(294)  评论(0编辑  收藏  举报