题目给出了三个要求

1、前两个规则 只需要对字母进行稳定排序即可。

sort()本身不稳定,要实现稳定排序只需要加一个order来记录字母输入的顺序即可,当字母比对相同,按照order来排序即可。

为了实现方便,不妨定义一个结构体,把字母letter和顺序order放一起,如下所示:

//结构体
struct word {
    char letter;
    int order;
    word(char l, int o): letter(l), order(o) {};
};
//排序算法
bool myCompare(const word& a, const word& b) {
    if (tolower(a.letter) == tolower(b.letter)) {
        return a.order < b.order;
    }
    return tolower(a.letter) < tolower(b.letter);
}

2、第三个规则,要求非字母保持原有顺序不变,似乎有点麻烦,但也好处理;

考虑到字母需要排序,我们可以把字母摘出来放到一个vector中,这样就把字母和非字母区分开了。

具体实现方法:定义string类型变量input,用getline(cin,input)获取输入后,遍历input,把里面的字母都摘出来放入一个新的vector中,把字母排序完成后再插入input中即可。

完整代码如下,逻辑很简单:

#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

struct word {
    char letter;
    int order;
    word(char l, int o): letter(l), order(o) {};
};

bool myCompare(const word& a, const word& b) {
    if (tolower(a.letter) == tolower(b.letter)) {
        return a.order < b.order;
    }
    return tolower(a.letter) < tolower(b.letter);
}

int main() {
    string input; //存储所有输入数据
    vector<word>words; //只存储输入数据中的字母
    while (getline(cin, input)) {
        words.clear();
        for (int i = 0; i < input.size(); i++) {
            if (isalpha(input[i]) ) { //如果是字母,摘出来放入words中
                words.emplace_back(input[i], i);
            }
        }
        sort(words.begin(), words.end(), myCompare);//排序
        for (int i = 0, j = 0; i < input.size(); i++) { //i和j分别遍历input和words
            if (isalpha(input[i])) {
                    input[i] = words[j++].letter;
            }
        }
        cout << input << endl;
    }
}
// 64 位输出请用 printf("%lld")