1. 程式人生 > 實用技巧 >7-12 集合的模擬實現(函式模板) (40分) pta c++

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