集合类实现

目录

题目描述

思路分析

题目分析

坑 

构造函数

输入函数 

Insert行为

Delete行为

析构函数

AC代码


题目描述

定义集合SET类,用来判断若干个集合之间的关系。具体要求如下:

需要有构造函数,利用已知数组构造集合。也要有析构函数,释放申请的内存空间。

注意:集合中无需考虑重复元素。集合下标从0开始。必须自己完成SET类的定义,使用STL进行作答记零分。

并且需要实现如下几个函数

1. Insert a b  向第a个集合中插入元素b

2. Show a  升序打印第a个集合中的全部元素

3. ShowAll 升序打印所有集合

4. IsIn a b 判断元素b是否在集合a中

5. Delete a b 删除第a个集合中的b元素(需要考虑b存在与不存在的情况)

6. IsEqual a b 判断a b两个集合是否相等

输入

第一行输入测试数据组数

对于每组测试数据先输入集合个数,接着对于每个集合先给出集合里元素的数量,然后跟着是每个元素。

然后为操作的次数及各个操作的参数。

输出

输出每次查询的结果,具体结果见输出样例

输入样例1

1
2
5 1 4 5 2 3
3 1 2 3
14
ShowAll
Insert 1 3
Show 1
Insert 1 5
Insert 0 1
IsIn 0 4
IsIn 0 9
Delete 0 1
Delete 0 1
Insert 0 1
IsEqual 0 1
Insert 1 4
IsEqual 0 1
ShowAll

输出样例1

思路分析

题目分析

题目要求定义集合SET类,用来判断若干个集合之间的关系,而且还不能用STL,这倒没什么,因为我也不会STL,不管怎样,这意味着我们需要在一个类里面实现判断的功能,也就是说,我们定义的类必须满足一个类对象能把所有集合都装进去的功能。

坑 

首先是题目说集合中无需考虑重复元素。

这句话的真正意思是,集合里面不能有重复的元素,所以首先能想到的就是insert功能的时候元素重复了就不要插进去了。

但是还有就是,它有可能在输入集合元素的时候就有重复的了,实际上它也这么干了。

还有就是,实现IsEqual功能的时候,必须再对集合元素排序一次,因为这才能判断出相等的集合。

构造函数

这个函数很关键,是代码整体实现的基础,按照题目要求,我们需要在构造函数中创建集合,而且由于题目要求我们在析构函数中释放申请内存,所以我们必须要在构造函数中动态分配内存。

		SET(int n)
		{
			set=new int*[n];
			for(int i=0;i<n;i++)
			set[i]=new int[100];
			setlength=new int[n];
			set_amount=n;
		}

输入函数 

这个函数相当重要,这使我们能够向类对象里面输入数据,由于这道题有坑的原因,我们还需要在输入的时候去掉重复的元素,并且让相应集合的长度自减。

		void input()
		{
			int i,j,k,temp,tag;
			for(i=0;i<set_amount;i++)
			{
				cin>>setlength[i];
				for(j=0;j<setlength[i];j++)
				{
					cin>>temp;
					tag=0;
					for(k=0;k<j;k++)
					if(set[i][k]==temp)
					{
						setlength[i]--;
						j--;
						tag=1;
						break;
					}
					if(tag==0)
					set[i][j]=temp;
				}			
			}			
		}

Insert行为

这个也拉出来讲一下吧,首先判断集合里面原本有没有要插入的元素,有就不插了直接return走人,没有就在尾部插进去,还要记得插完让集合长度自增。

		void Insert(int a,int b)
		{
			int i;
			for(i=0;i<setlength[a];i++)
			if(set[a][i]==b)
			return;
			set[a][i]=b;
			setlength[a]++;
		}

Delete行为

这个也讲一下,首先也要判断一下集合里面有没有要删除的元素,没有我就error。

如果有,那么就要删,怎么删呢?

由于是数组,所以可以把末尾的元素覆盖要删的元素,之后让集合长度自减即可。

		void Delete(int a,int b)
		{
			int i;
			for(i=0;i<setlength[a];i++)
			if(set[a][i]==b)
			{
				setlength[a]--;
				set[a][i]=set[a][setlength[a]];
				cout<<"Delete Success!"<<endl;
				return;
			}
			cout<<"Error!"<<endl;				
		}

析构函数

在这里,析构函数的实现相对其他函数来说,比较简单,就是释放内存。

		~SET()
		{
			for(int i=0;i<set_amount;i++)
			delete[] set[i];
			delete[] set;
			delete[] setlength;
		}

AC代码

#include"iostream"
#include"algorithm"
#include"string"
using namespace std;
class SET
{
	private:
		int set_amount;
		int * setlength;
		int ** set;
	public:
		SET(int n)
		{
			set=new int*[n];
			for(int i=0;i<n;i++)
			set[i]=new int[100];
			setlength=new int[n];
			set_amount=n;
		}
		void input()
		{
			int i,j,k,temp,tag;
			for(i=0;i<set_amount;i++)
			{
				cin>>setlength[i];
				for(j=0;j<setlength[i];j++)
				{
					cin>>temp;
					tag=0;
					for(k=0;k<j;k++)
					if(set[i][k]==temp)
					{
						setlength[i]--;
						j--;
						tag=1;
						break;
					}
					if(tag==0)
					set[i][j]=temp;
				}			
			}			
		}
		void Insert(int a,int b)
		{
			int i;
			for(i=0;i<setlength[a];i++)
			if(set[a][i]==b)
			return;
			set[a][i]=b;
			setlength[a]++;
		}
		void Show(int a)
		{
			sort(set[a],set[a]+setlength[a]);
			for(int i=0;i<setlength[a];i++)
			{
				cout<<"SET"<<a<<':';
				for(i=0;i<setlength[a];i++)
				cout<<' '<<set[a][i];
				cout<<endl;
			}
		}
		void ShowAll()
		{
			int i,j;
			for(i=0;i<set_amount;i++)
			sort(set[i],set[i]+setlength[i]);
			for(i=0;i<set_amount;i++)
			{
				cout<<"SET"<<i<<':';
				for(j=0;j<setlength[i];j++)
				cout<<' '<<set[i][j];
				cout<<endl;
			}
		}
		void IsIn(int a,int b)
		{
			int i;
			for(i=0;i<setlength[a];i++)
			if(set[a][i]==b)
			{
				cout<<b<<"is in set"<<a<<endl;
				return;
			}
			cout<<b<<"is not in set"<<a<<endl;					
		}
		void Delete(int a,int b)
		{
			int i;
			for(i=0;i<setlength[a];i++)
			if(set[a][i]==b)
			{
				setlength[a]--;
				set[a][i]=set[a][setlength[a]];
				cout<<"Delete Success!"<<endl;
				return;
			}
			cout<<"Error!"<<endl;				
		}
		void IsEqual(int a,int b)
		{
			sort(set[a],set[a]+setlength[a]);
			sort(set[b],set[b]+setlength[b]);			
			int i;
			if(setlength[a]!=setlength[b])
			{
				cout<<"set"<<a<<" and set"<<b<<" is not equal"<<endl;
				return;
			}
			for(i=0;i<setlength[a];i++)
			if(set[a][i]!=set[b][i])
			{
				cout<<"set"<<a<<" and set"<<b<<" is not equal"<<endl;
				return;
			}
			cout<<"set"<<a<<" and set"<<b<<" is equal"<<endl;
		}
		~SET()
		{
			for(int i=0;i<set_amount;i++)
			delete[] set[i];
			delete[] set;
			delete[] setlength;
		}	
};
int main()
{
	int test,set_amount,instrution_amount,a,b;
	string instruction;
	string code[6]={"Insert","Show","ShowAll","IsIn","Delete","IsEqual"};
	cin>>test;
	while(test--)
	{
		cin>>set_amount;
		SET Set(set_amount);
		Set.input();
		cin>>instrution_amount;
		while(instrution_amount--)
		{
			cin>>instruction;
			if(instruction==code[0])
			{
				cin>>a>>b;
				Set.Insert(a,b);
			}
			else if(instruction==code[1])
			{
				cin>>a;
				Set.Show(a);
			}
			else if(instruction==code[2])
			{
				Set.ShowAll();
			}
			else if(instruction==code[3])
			{
				cin>>a>>b;
				Set.IsIn(a,b);
			}
			else if(instruction==code[4])
			{
				cin>>a>>b;
				Set.Delete(a,b);
			}
			else if(instruction==code[5])
			{
				cin>>a>>b;
				Set.IsEqual(a,b);
			}
		}
	}
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaolinYe(叶茂林)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值