7.国家名称排序
分析
一开始打算用二维的字符数组来操作,但是数组指针玩不太明白,于是改用结构体,结构体country里面仅一个成员name(字符数组),这样就有两种解题方法:
方法一:使用sort排序
- 创建一个country数组cry,大小为101(因为n最大为100)
- 输入的国家名称放到country数组cry元素对应的name属性里面
- 使用sort对country数组cry进行排序,注意,传入的三个参数如下,分别为country数组的首指针、尾后指针和排序函数名cmp
sort(&cry[0], &cry[n], cmp);
- 关于cmp函数的编写,是基于sort函数的特性,即两个待排的元素a,b,注意a和b都是country类型的,
- 如果cmp(a,b)的值是true则不交换顺序,如果是false则交换顺序,
- 再基于本题的要求,按照strcmp(a.name,b.name)判断字符串的大小即可,
- 如果a.name的字母序数大于b.name,那么strcmp(a.name,b.name)值为正数
- 如果a.name的字母序数小于或等于b.name,那么strcmp(a.name,b.name)值为负数或0
- 那么,就应该在a.name的字母序数小于或等于b.name的时候,让cmp函数返回true,表示不用交换,否则就要交换。
方法一::使用sort排序(代码)
#include <cstdio>
#include <queue>
#include <cmath>
#include <cstring>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct country {
char name[50];
};
country cry[101];
bool cmp(country a, country b) {
if (strcmp(a.name, b.name) <= 0) {
return true;
} else {
return false;
}
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%s", cry[i].name);
}
sort(&cry[0], &cry[n], cmp);
for (int i = 0; i < n; i++) {
printf("%s\n", cry[i].name);
}
}
return 0;
}
方法二:使用优先队列
优先队列是大根堆,为了满足要求,需要对<符号进行重载,改写的方式与方法一使用sort函数时写得cmp函数思想类似。
方法二::使用优先队列(代码)
#include <cstdio>
#include <queue>
#include <cmath>
#include <cstring>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
struct country {
char name[50];
};
priority_queue<country> cry;
bool operator <(country a, country b) {
if (strcmp(a.name, b.name) <= 0) {
return false;
} else {
return true;
}
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
country temp;
scanf("%s", temp.name);
cry.push(temp);
}
while (cry.empty() != true) {
printf("%s\n", cry.top().name);
cry.pop();
}
}
return 0;
}