输入一串字符,请对字符中的各个英文字符(大小写分开统计),数字,空格进行统计,并按照统计个数由多到少输出,如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
1、输入的字符串以‘\0’结尾。
例1:
输入字符串“aadddccddc11 2###”
输出信息“dc1a 2”
例2:
输入字符串“Aaaabb 12”
输出信息“ab 12A”
再次输入“A11122”
输出信息“12aAb ”
#include<stdlib.h> #include<vector> #include<map> #include<algorithm> using namespace std; bool compare(const pair<char, int>& p1, const pair<char, int>& p2){ if (p1.second!=p2.second){ return p1.second < p2.second; } else{ return p1.first < p2.first; } } int charcot(char* input,char* output){ if (NULL== input){ return -1; } map<char, int> char_n; while (*input){ if (((*input >= '0') && (*input <= '9')) || ((*input >= 'a') && (*input <= 'z')) || ((*input >= 'A') && (*input <= 'Z')) || (*input = ' ')){ if (char_n.at(*input)){ char_n.insert(make_pair(*input, char_n.at(*input) + 1)); } else{ char_n.insert(make_pair(*input, 1)); } } input++; } vector<pair<char, int>> char_um(char_n.begin(),char_n.end()); sort(char_um.begin(), char_um.end(), compare); for (int i = 0; i < char_um.size();i++){ *output = char_um[i].first; output++; } *output = '\0'; return 0; } int main(){ return 0; }
方法一:链表操作
#include <iostream> #include <stdlib.h> #include <string.h> using namespace std; /// 声明数据结构 typedef struct stRst{ char c; int num; struct stRst* next; }Rst; /// 定义全局变量 static char* gstrInput; static Rst* gRst; static int gRstNum = 0; int main() { void InputString(char* pInput); int GetStaticString(char* *pInput); void Clear(); int num; char pInput[100]; char* pInput2[63]; for(;;) { cout<<"1:输入字符串 2:统计结果 3:清空数据 其它:退出"<<endl; cin>>num; switch(num) { case 1: cin>>pInput; InputString(pInput); break; case 2: cout<<GetStaticString(pInput2)<<endl; if(GetStaticString(pInput2)) cout<<pInput2[0]<<endl; break; case 3: Clear(); break; default: return 0; break; } } return 0; } /// 功能:输入待统计字符串供用户统计 /// 输入:char* pInput 待统计的字符串 /// 输出:无 /// 返回:无 void InputString(char* pInput) { if(!pInput) return; if(!gstrInput) { free(gstrInput); gstrInput = NULL; } /// 保存最新输入字符串 gstrInput = (char*)malloc(strlen(pInput)+1); memset(gstrInput, 0, strlen(pInput)+1); strcpy(gstrInput, pInput); } /// 功能:获取前面输入的字符串的统计信息 /// 输入:无 /// 输出:char* *pInput 获取统计结果,内存由函数自己申请,在函数外部释放,如果没有统计信息,返回NULL /// 返回:int 如果成功返回1,失败返回0 int GetStaticString(char* *pInput) { if(gstrInput == NULL || strlen(gstrInput) <= 0) { *pInput = NULL; return 0; } int nNodeNum = 0; /// 新输入字符串统计 char* pTmp = gstrInput; while(*pTmp) /// 遍历新输入字符串 { ///符合'a'-'z', 'A'-'Z', '0'-'9', 空格的字符进行处理 if(('a' <= (*pTmp) && (*pTmp) <= 'z') || ('A' <= (*pTmp) && (*pTmp) <= 'Z') || ('0' <= (*pTmp) && (*pTmp) <= '9') || (*pTmp) == ' ') { if(NULL == gRst) ///如果统计结果是空,新创建节点保存 { gRst = (Rst*)malloc(sizeof(Rst)); memset(gRst, 0, sizeof(Rst)); gRst->c = *pTmp; gRst->num = 1; nNodeNum++; } else ///统计结果非空 { Rst* pTmpSearch = gRst; Rst* pTmpPreNode = gRst; bool bFound = false; while (pTmpSearch) ///遍历统计结果链表,有相同值的节点进行数值累加 { if(*pTmp == pTmpSearch->c) { pTmpSearch->num++; bFound = true; break; } pTmpPreNode = pTmpSearch; pTmpSearch = pTmpSearch->next; } if(!bFound) /// 链表没有相同值节点,创建新节点并加到链表末尾 { Rst* pTmpNew = (Rst*)malloc(sizeof(Rst)); memset(pTmpNew, 0, sizeof(Rst)); pTmpNew->c = *pTmp; pTmpNew->num = 1; pTmpPreNode->next = pTmpNew; nNodeNum++; } } } pTmp++; } if(gRst) /// 统计结果有值 { gRstNum += nNodeNum; *pInput = (char*)malloc(gRstNum+1); /// 对传出参数申请动态内存 memset(*pInput, 0, gRstNum+1); Rst* pTmpSearch = gRst; char* pChTmp = *pInput; while(pTmpSearch) /// 对统计结果的链表进行冒泡排序,规则为:按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出 { Rst* pCur = pTmpSearch; Rst* pNext = pTmpSearch->next; while(pNext) { if((pNext->num > pCur->num) || (pNext->num == pCur->num && pNext->c < pCur->c)) pCur = pNext; pNext = pNext->next; } if(pTmpSearch != pCur) { char cTmp = pTmpSearch->c; int nTmp = pTmpSearch->num; pTmpSearch->c = pCur->c; pTmpSearch->num = pCur->num; pCur->c = cTmp; pCur->num = nTmp; } pTmpSearch = pTmpSearch->next; } pTmpSearch = gRst; char* pchTmp = *pInput; while(pTmpSearch) /// 将排序后的数据写到传出参数的内存中 { *pchTmp++ = pTmpSearch->c; pTmpSearch = pTmpSearch->next; } } return 1; } /// 功能:清空前面输入的字符串的统计信息 /// 输入:无 /// 输出:无 /// 返回:无 void Clear() ///将全局变量内存释放并重新初始化 { if(gstrInput) { free(gstrInput); gstrInput = NULL; } if(gRst) { Rst* pCurNode = gRst; while(pCurNode) { Rst* pNextNode = pCurNode->next; free(pCurNode); pCurNode = pNextNode; } gRst = NULL; } gRstNum = 0; }