蒜头君前几天把最心爱的小麦手机摔坏了,新手机又要好几天才能到货,于是蒜头君不得暂时用它珍藏已久的诺鸡鸭非智能手机了。手机的存储空间非常小,以至于未接来电、已接来电和已拨电话都只能各自保存最近的10条记录。
蒜头买了手机以后的未接来电、已接来电和已拨电话记录全部给出。机智的蒜头能够猜到这个手机使用了循环队列来实现最近记录的功能,不过它不会写代码(没手怎么写π_π),于是它来求助正在算法课程中过关斩将的你了。你能帮帮它吗?
输入格式:
每条记录包含两个数字,第一个数代表记录类型,第二个数代表手机号码。
其中0代表未接来电,1代表已接来电,2代表已拨电话。
输出格式:
分3列输出未接来电、已接来电、已拨电话。
列之间用空格分割,后接电话在最先输出,不足10条用0占位。不明白的话参考样例输出哈。
样例输入
2 18270477699 1 10149800116 0 19906559817 1 16209018105 1 16804212234 2 19289130583 1 17982711123 0 10897630486 1 11860787674 0 15192777554
样例输出
15192777554 11860787674 19289130583 10897630486 17982711123 18270477699 19906559817 16804212234 0 0 16209018105 0 0 10149800116 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 using namespace std; 5 const int LEN = 10; 6 // 自定义循环队列类,来实现题目要求的某一类通话列表的保存 7 // 在程序中调用定义举例如下: 8 // circular_queue Q; 9 // 如果要定义数组,比如这道题需要定义一个长度为3的循环队列数组,则参考如下定义: 10 // circular_queue Q[3]; 11 class circular_queue { 12 public: 13 // 自定义的类用到了STL中的deque,也就是双端队列 14 // 双端队列,顾名思义,可以从队列的头或者尾插入或者删除元素 15 deque<string> q; 16 // 构造函数,将队列清空 17 // 构造函数会在声明一个类变量的时候自动调用 18 circular_queue() { 19 q.clear(); 20 } 21 // 在队尾插入元素,如果队列长度超过限制(LEN=10)则将队首元素弹出 22 // 调用方法举例如下: 23 // Q.add("hello world"); 24 void add(string str) { 25 // 在队尾插入元素 26 q.push_back(str); 27 // 判断队列长度是否超过限制 28 if (q.size() > LEN) { 29 // 如果长度超过限制,则弹出队首元素 30 q.pop_front(); 31 } 32 } 33 // 返回队尾元素的值,如果队列是空的,就按照题面要求返回一个字符串"0" 34 string get_tail() { 35 // 判断队列是否为空 36 if (q.size() > 0) { 37 // 返回队尾元素 38 return q.back(); 39 } else { 40 // 返回一个默认的字符串"0" 41 return "0"; 42 } 43 } 44 // 弹出队尾元素,如果队列空则不进行操作 45 void pop_tail() { 46 // 判断队列是否为空 47 if (q.size() > 0) { 48 // 弹出队尾元素 49 q.pop_back(); 50 } 51 } 52 }; 53 int main() { 54 int _type; 55 string str; 56 circular_queue q[3]; 57 // 读到文件结束,每行一个整数和一个字符串 58 while (cin >> _type >> str) { 59 // 这里实现循环队列的插入操作。 60 // _type的范围为0,1,2,刚好对应到q数组的三个下标 61 // 插入元素要调用循环队列的add(str)方法 62 // 比如对于循环队列q,插入元素的代码为 q.add(str); 63 // 聪明的你,快在下面一行把答案写出来吧 64 65 q[_type].add(str); 66 } 67 for (int i = 0; i < 10; ++i) { 68 // 输出三个循环队列的队尾元素,要调用循环队列的get_tail()方法 69 // 比如对于循环队列q,获取队尾元素值的代码为 q.get_tail(); 70 71 cout << q[0]. get_tail()<< " " << q[1].get_tail() << " " << q[2].get_tail() << endl; 72 73 // 接下来依次将三个循环队列的队尾元素分别删除 74 // 对于循环队列q,删除循环队列的队尾元素的代码为 q.pop_tail(); 75 76 q[0].pop_tail(); 77 q[1].pop_tail(); 78 q[2].pop_tail(); 79 } 80 return 0; 81 }
时间: 2024-11-07 01:39:54