题目描述
一个复数(x+iy)集合,两种操作作用在该集合上: 1、Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出 empty ,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE; 2 Insert a+ib 指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE; 最开始要读入一个int n,表示接下来的n行每一行都是一条命令。
输入描述:
输入有多组数据。 每组输入一个n(1<=n<=1000),然后再输入n条指令。
输出描述:
根据指令输出结果。 模相等的输出b较小的复数。 a和b都是非负数。
示例1
输入
3 Pop Insert 1+i2 Pop
输出
empty SIZE = 1 1+i2 SIZE = 0
/* 程序设计思路:由于输出的数据为一个复数,故建立一个复数类,且建立一个为该复数类类型的向量。进行Insert操作时, 将复数压到向量尾部,输出size,并进行按题意的排序。进行Pop操作时,若向量为空,则输出empty,若不为空, 则输出向量中内容,并弹出向量尾部,输出size。 出向量尾部 附: 1、sort函数可以三个参数也可以两个参数,必须的头文件#include < algorithm>和using namespace std; 2、它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n) 3、Sort函数有三个参数:(第三个参数可不写) (1)第一个是要排序的数组的起始地址。 (2)第二个是结束的地址(最后一位要排序的地址) (3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数, 此时默认的排序方法是从小到大排序。也可以自定义排序规则。 */ #include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; class complex{ //复数类 public: int real; char op; int img; }; bool com(complex a,complex b) //定义比较规则,这个很重要。 { int x=a.real*a.real+a.img*a.img; int y=b.real*b.real+b.img*b.img; if(x<y) //用默认的升序排序,最后一个为最大。 return true; else { if(x==y) if(a.img<b.img) return true; //降序排列 } return false; //降序排列 } int main() { vector<complex> vec; int N; string st; char ch; while(cin>>N) { for(int i=0;i<N;i++) { cin>>st; if(st=="Insert") //Insert操作 { complex cp; cin>>cp.real>>cp.op>>ch>>cp.img; vec.push_back(cp); cout<<"SIZE = "<<vec.size()<<endl; sort(vec.begin(),vec.end(),com); } else //Pop操作 { if(vec.empty()) cout<<"empty"<<endl; else { complex c=vec.back(); vec.pop_back(); cout<<c.real<<c.op<<"i"<<c.img<<endl; cout<<"SIZE = "<<vec.size()<<endl; } } } } return 0; }