本题思路很简单,借助重载运算符和优先队列,我们可以很容易的将输入的复数进行从大到小排列并输出,每次根据具体情况决定打印顺序即可。主要应该关注重载运算符和构造函数的使用,以及优先队列隐含的数据类型必须支持小于运算符的思想。重载运算符也是把大根堆变成小根堆的方式之一
#include <bits/stdc++.h> using namespace std; struct Complex { //结构体定义,复数可表示为a+bi int a; int b; Complex(int _a,int _b){ //构造函数 a = _a; b = _b; } }; bool operator < (Complex lhs,Complex rhs){ //运算符重载 if(lhs.a*lhs.a+lhs.b*lhs.b < rhs.a*rhs.a+rhs.b*rhs.b){ return true; } else{ return false; } } int main() { int n; scanf("%d",&n); char arr[10]; priority_queue<Complex> Myqueue; for(int i = 0;i<n;i++){ scanf("%s",arr); if(arr[0]=='P'){ if(!Myqueue.empty()){ printf("%d+i%d\n",Myqueue.top().a,Myqueue.top().b); Myqueue.pop(); printf("SIZE = %d\n",Myqueue.size()); } else{ printf("empty\n"); } } else{ Complex n = Complex(0, 0); scanf("%d+i%d",&n.a,&n.b); Myqueue.push(n); printf("SIZE = %d\n",Myqueue.size()); } } return 0; }