POJ C++程序设计 编程题#7:字符串排序

编程题#7:字符串排序

来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

总时间限制: 1000ms 内存限制: 1024kB

描述

请按照要求对输入的字符串进行排序。

#include <iostream>
#include <string>
#include <list>
using namespace std;

class A{
private:
        string name;
public:
        A(string n) :name(n){}
        friend bool operator < (const class A& a1, const class A &a2);
        friend bool operator == (const class A &a1, const class A &a2){
                if (a1.name.size() == a2.name.size())
                        return true;
                else
                        return false;
        }
        friend ostream & operator << (ostream &o, const A &a){
                o << a.name;
                return o;
        }
        string get_name() const{
                return name;
        }
        int get_size() const{
                return name.size();
        }
};
// 在此处补充你的代码
int main(int argc, char* argv[])
{
        list<A> lst;
        int ncase, n, i = 1;
        string s;
        cin >> ncase;
        while (ncase--){
                cout << "Case: "<<i++ << endl;
                cin >> n;
                for (int i = 0; i < n; i++){
                         cin >> s;
                         lst.push_back(A(s));
                }
                lst.sort();
                Show(lst.begin(), lst.end(), Print());

                cout << endl;
                lst.sort(MyLarge<A>());
                Show(lst.begin(), lst.end(), Print());
                cout << endl;
                lst.clear();
        }
        return 0;
}

输入

第一行是正整数T,表示测试数据的组数

每组测试数据输入共两行,

第一行是正整数N,表示字符串个数

第二行是N个字符串, 字符串间用空格分离

 

输出

对于每组测试数据,先输出一行:

Case: n

如对第一组数据就输出Case: 1

第二行按照字符串长度从小到大排序之后输出N个字符串,字符串之间以空格间隔(不会出现字符串长度相同的情况)

第三行按照字符串首字符ASCII码序从小到大排序之后输出N个字符串,字符串之间以空格间隔(不会出现字符串首字母相同的情况)

 

样例输入

2
4
a bnss ds tsdfasg
5
aaa bbbb ccccd sa q

 

样例输出

Case: 1
a ds bnss tsdfasg
a bnss ds tsdfasg
Case: 2
q sa aaa bbbb ccccd
aaa bbbb ccccd q sa

 1 #include <iostream>
 2 #include <string>
 3 #include <list>
 4 using namespace std;
 5 
 6 class A{
 7 private:
 8     string name;
 9 public:
10     A(string n) :name(n){}
11     friend bool operator < (const class A& a1, const class A &a2);
12     friend bool operator == (const class A &a1, const class A &a2){
13         if (a1.name.size() == a2.name.size())
14             return true;
15         else
16             return false;
17     }
18     friend ostream & operator << (ostream &o, const A &a){
19         o << a.name;
20         return o;
21     }
22     string get_name() const{
23         return name;
24     }
25     int get_size() const{
26         return name.size();
27     }
28 };
29 // 在此处补充你的代码
30 bool operator< (const A& a1, const A &a2) {
31     return a1.name.size() < a2.name.size();
32 };
33 
34 template <class Iterator, class Function>
35 void Show(Iterator begin, Iterator end, Function print) {
36     for (Iterator iterator1 = begin; iterator1 != end; iterator1++) {
37         print(*iterator1);
38     }
39 };
40 
41 class Print {
42 public:
43     void operator()(const A &a) {
44         cout << a.get_name()<< " ";
45     }
46 };
47 
48 template <class A>
49 struct MyLarge {
50     inline bool operator()(const A &a1, const A &a2) {
51         return a1.get_name() < a2.get_name();
52     }
53 };
54 
55 int main(int argc, char* argv[])
56 {
57     list<A> lst;
58     int ncase, n, i = 1;
59     string s;
60     cin >> ncase;
61     while (ncase--){
62         cout << "Case: "<<i++ << endl;
63         cin >> n;
64         for (int i = 0; i < n; i++){
65             cin >> s;
66             lst.push_back(A(s));
67         }
68         lst.sort();
69         Show(lst.begin(), lst.end(), Print());
70 
71         cout << endl;
72         lst.sort(MyLarge<A>());
73         Show(lst.begin(), lst.end(), Print());
74         cout << endl;
75         lst.clear();
76     }
77     return 0;
78 }
原文地址:https://www.cnblogs.com/dagon/p/4833352.html