PTA 集合的模拟实现(类模板)

题目:

我们可以用一个类来模拟集合及集合运算,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!

代码:

#include<iostream>
#include<string>
using namespace std;
template <class T>
class MySet
{
public:
	MySet() {};
	int addSet(T elem);
	int deleSet(T elem);
	int findElem(T elem);
private:
	T data[100];
	int count = 0;
};
template<class T>
int MySet<T>::addSet(T elem)
{
	if (count >= 100) {
		cout << "Full Set"<<endl;
		return 0;
	}
	for(int i = 0;i<count;i++)
		if (elem == data[i]) {
			cout << elem << " is already exist!"<<endl;
			return 0;
		}
	cout << count << endl;
	data[count++] = elem;
	return 0;
}
template<class T>
int MySet<T>::deleSet(T elem)
{
	int judge = 0, k = 0;
	for (int i = 0; i < count; i++)
		if (data[i] == elem) {
			judge = 1;
			k = i;
			break;
		}
	if (judge) {
		for (int i = k; i < count; i++)
			data[i] = data[i + 1];
		cout << k << endl;
	}
	else  cout << elem << " is not exist!" << endl;
	return k;
}
template<class T>
int MySet<T>::findElem(T elem)
{
	int judge = 0,k = 0;
	for(int i = 0;i<count;i++)
		if (elem == data[i]) {
			judge = 1;
			k = i;
			break;
		}
	if (!judge) cout << elem << " is not exist!" << endl;
	else cout << k << endl;
	return k;
}
int main()
{
	MySet<int> intSet;
	MySet<double> douSet;
	MySet<string> strSet;
	int flag1, flag2;
	while (cin >> flag1 && flag1 != 0) {
		cin >> flag2;
		if (flag1 == 1) {
			int flag3;
			cin >> flag3;
			if (flag2 == 1) intSet.addSet(flag3);
			else if (flag2 == 2) intSet.deleSet(flag3);
			else intSet.findElem(flag3);
		}
		else if (flag1 == 2) {
			double flag3;
			cin >> flag3;
			if (flag2 == 1) douSet.addSet(flag3);
			else if (flag2 == 2) douSet.deleSet(flag3);
			else douSet.findElem(flag3);
		}
		else {
			string flag3;
			cin >> flag3;
			if (flag2 == 1) strSet.addSet(flag3);
			else if (flag2 == 2) strSet.deleSet(flag3);
			else strSet.findElem(flag3);
		}
	}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值