编程题 #1:字符串操作
给定nnn个字符串(从111开始编号),每个字符串中的字符位置从000开始编号,长度为1∼5001\sim 5001∼500,现有如下若干操作:
copy N X L:取出第NNN个字符串第XXX个字符开始的长度为L的字符串。add S1 S2:判断S1S_1S1,S2S_2S2是否为0∼999990\sim 999990∼99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。find S N:在第NNN个字符串中从左开始找寻SSS字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。rfind S N:在第NNN个字符串中从右开始找寻SSS字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。insert S N X:在第NNN个字符串的第XXX个字符位置中插入SSS字符串。reset S N:将第NNN个字符串变为SSS。print N:打印输出第NNN个字符串。printall:打印输出所有字符串。over:结束操作。
其中NNN,XXX,LLL可由find与rfind操作表达式构成,SSS,S1S_1S1,S2S_2S2可由copy与add操作表达式构成。
输入
第一行为一个整数nnn(nnn在1∼201\sim 201∼20之间)
接下来nnn行为nnn个字符串,字符串不包含空格及操作命令等。
接下来若干行为一系列操作,直到over结束。
输出
根据操作提示输出对应字符串。
样例输入
3 329strjvc Opadfk48 Ifjoqwoqejr insert copy 1 find 2 1 2 2 2 print 2 reset add copy 1 find 3 1 3 copy 2 find 2 2 2 3 print 3 insert a 3 2 printall over样例输出
Op29adfk48 358 329strjvc Op29adfk48 35a8提示:推荐使用string类中的相关操作函数。
Solution
采用类似于表达式求值的方式解析输入即可。
#include<iostream>#include<string>#include<vector>#include<queue>#include<cstdlib>//atoi字符串转整数的函数#include<cstring>//memset函数头文件#include<cstdio>//sprintf函数头文件usingnamespacestd;vector<string>strGiven;//存储被给的字符串queue<string>strCommand;//存储命令字符串char*strItoa=newchar[101];//存储将整数转换的字符串,并作返回值使用voidstrStorage(constchar*ch);//将输入的一行数据分为若干个命令参数,并存入队列当中boolstrProcess();//开始处理一行命令,注意开头的命令只可能是“insert”“reset”“print”“printall”和“over”stringcommandOp();//递归算法处理一行中的命令组合stringnyCopy(intn,intx,intl);//copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串stringnyAdd(string s1,string s2);//add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串intnyFind(intn,string s);//find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。intnyRFind(intn,string s);//rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。voidnyInsert(intn,intx,string s);//在第N个字符串的第X个字符位置中插入S字符串voidnyReset(intn,string s);//将第N个字符串变为SvoidnyPrint(intn);//打印输出第N个字符串voidnyPrintAll();//打印输出所有字符串intmain(){intn;cin>>n;for(inti=0;i<n;i++){string str;cin>>str;strGiven.push_back(str);}cin.get();char*ch=newchar[501];while(1){cin.getline(ch,500,'\n');strStorage(ch);intt=strProcess();if(t==false){break;}}deletech;deletestrItoa;return0;}/* 将输入的一行数据分为若干个命令参数,并存入队列当中 */voidstrStorage(constchar*ch){string str;for(inti=0;ch[i]!='\0';i++){if(ch[i]!=' '){str.push_back(ch[i]);}else{strCommand.push(str);str.clear();}}//记录最后一个字符串strCommand.push(str);}/* 开始处理一行命令,注意开头的命令只可能是“insert”“reset”“print”“printall”和“over” 遇到"over"时返回false,程序结束 */boolstrProcess(){string str=strCommand.front();strCommand.pop();if(str=="insert"){string s=commandOp();intn=atoi(commandOp().c_str());intx=atoi(commandOp().c_str());nyInsert(n,x,s);}elseif(str=="reset"){string s=commandOp();intn=atoi(commandOp().c_str());nyReset(n,s);}elseif(str=="print"){intn=atoi(commandOp().c_str());nyPrint(n);}elseif(str=="printall"){nyPrintAll();}elseif(str=="over"){returnfalse;}returntrue;}/* 递归算法处理一行中的命令组合 */stringcommandOp(){string str=strCommand.front();strCommand.pop();if(str=="copy"){intn=atoi(commandOp().c_str());intx=atoi(commandOp().c_str());intl=atoi(commandOp().c_str());returnnyCopy(n,x,l);}elseif(str=="add"){string s1=commandOp();string s2=commandOp();returnnyAdd(s1,s2);}elseif(str=="find"){string s=commandOp();intn=atoi(commandOp().c_str());sprintf(strItoa,"%d",nyFind(n,s));returnstrItoa;}elseif(str=="rfind"){string s=commandOp();intn=atoi(commandOp().c_str());sprintf(strItoa,"%d",nyRFind(n,s));returnstrItoa;}else//参数{returnstr;}}/* copy函数 */stringnyCopy(intn,intx,intl){string str=strGiven.at(n-1);returnstr.substr(x,l);}/* add函数 */stringnyAdd(string s1,string s2){//判断字符串里是否全为数字//因为83s经过atoi后会变为83for(inti=0;i<s1.size();i++){if(s1.at(i)<'0'||s1.at(i)>'9'){returns1+s2;}}for(inti=0;i<s2.size();i++){if(s2.at(i)<'0'||s2.at(i)>'9'){returns1+s2;}}//若全为数字,判断是否在0和99999之间longa=atoi(s1.c_str());longb=atoi(s2.c_str());if(a>=0&&a<=99999&&b>=0&&b<=99999){longc=a+b;sprintf(strItoa,"%d",c);returnstrItoa;}else{returns1+s2;}}/* find函数 */intnyFind(intn,string s){intpos=strGiven.at(n-1).find(s);if(pos==string::npos){returns.size();}else{returnpos;}}/* rfind函数 */intnyRFind(intn,string s){intpos=strGiven.at(n-1).rfind(s);if(pos==string::npos){returns.size();}else{returnpos;}}/* insert函数 */voidnyInsert(intn,intx,string s){strGiven.at(n-1).insert(x,s);}/* reset函数 */voidnyReset(intn,string s){strGiven.at(n-1).swap(s);}/* print函数 */voidnyPrint(intn){cout<<strGiven.at(n-1)<<endl;}/* printall函数 */voidnyPrintAll(){for(unsignedinti=0;i<strGiven.size();i++){cout<<strGiven.at(i)<<endl;}}