串操作,C++实现

对串的基本操作都全已经实现

对kmp,kf字符串替换等功能全都已经实现

由于时间原因。没来得及注释,希望大家参考见谅。

串操作hstring.h头文件实现

 //kallen
1
#ifndef _HSTRING_H_ 2 #define _HSTRING_H_ 3 #include <iostream> 4 class mString 5 { 6 public: 7 mString(); 8 void newString(const char *ms); 9 ~mString(); 10 bool isEmpty()const; 11 int lengthString()const; 12 void copyString(const mString &src); 13 friend int compareString(const mString &lhs,const mString &rhs); 14 void clearStirng(); 15 void concatString(const mString &lhs_src,const mString &rhs_src); 16 void subString(const mString &src,int pos,int len); 17 void insertString(int pos,const mString &ms); 18 void deleteString(int pos,int len); 19 int indexkfString(const mString &mt,int pos); 20 int indexkmpString(const mString &mt,int pos,int *next); 21 void replaceString(int repos,const mString& mt,const mString &mv,int *next); 22 23 void insaftposString(int pps,const mString& mt,const mString& mv); 24 void printString()const; 25 private: 26 char *base; 27 int length; 28 void nextSt(const mString& mt,int *next); 29 }; 30 31 #endif //_HSTRING_H_

hstring.cpp的实现代码

  1 #include "hstring.h"

  2 

  3 mString::mString()

  4 {

  5     base = NULL;

  6     length = 0;

  7 }

  8 

  9 mString::~mString()

 10 {

 11     if (base!=NULL)

 12     {

 13         delete base;

 14     }

 15     base = NULL;

 16 }

 17 

 18 void mString::newString(const char *ms)

 19 {

 20     int i = 0;

 21     while(ms[i]!='\0')

 22     {

 23         ++i;

 24     }

 25     length = i;

 26     base = new char[length + 1];

 27     for (int j = 0;j<length;++j)

 28     {

 29         base[j] = ms[j];

 30     }

 31     base[length] = '\0';

 32 }

 33 

 34 bool mString::isEmpty()const

 35 {

 36     if (0 == length)

 37     {

 38         return true;

 39     }

 40     else

 41     {

 42         return false;

 43     }

 44 }

 45 

 46 int mString::lengthString()const

 47 {

 48     return length;

 49 }

 50 

 51 void mString::copyString(const mString &src)  

 52 {

 53     int i = 0;

 54     for (; i<this->length;++i)

 55     {

 56         base[i] = src.base[i];

 57     }

 58 }

 59 

 60 int compareString(const mString &lhs,const mString &rhs)

 61 {

 62     int i = 0;

 63     while (lhs.base[i]!='\0'&&lhs.base[i]!='\0')

 64     {

 65         if (lhs.base[i] > rhs.base[i])

 66         {

 67             return 1;

 68         }

 69         else if (lhs.base[i] < rhs.base[i])

 70         {

 71             return -1;

 72         }

 73         else

 74         {

 75             ++i;

 76         }

 77     }

 78     if (lhs.base[i] =='\0'&&rhs.base[i]!='\0')

 79     {

 80         return -1;

 81     }

 82     else if (lhs.base[i] !='\0'&&rhs.base[i]=='\0')

 83     {

 84         return 1;

 85     }

 86     else

 87     {

 88         return 0;

 89     }

 90 }

 91 

 92 void mString::clearStirng()

 93 {

 94     length = 0;

 95 }

 96 

 97 void mString::concatString(const mString &lhs_src,const mString &rhs_src)

 98 {

 99     

100     length = lhs_src.length + rhs_src.length;

101     this->base = new char[length+1];

102     

103     for (int i = 0; i<lhs_src.length; ++i )

104     {

105         this->base[i] = lhs_src.base[i];

106     }

107     for (int i = lhs_src.length,j = 0; j < rhs_src.length; ++j,++i )

108     {

109         this->base[i] = rhs_src.base[j];

110     }

111     this->base[length] = '\0';

112 

113 }

114 

115 void mString::printString()const

116 {

117     int i = 0;

118     for (;i<length;++i)

119     {

120         std::cout<<base[i];

121     }

122     std::cout<<std::endl;

123 }

124 

125 void mString::subString(const mString &src,int pos,int len)

126 {

127     if (src.length != 0 )

128     {

129         if (pos>src.length)

130         {

131             std::cout<<"The  location of pos is illegal!"<<std::endl;

132         }

133         else

134         {

135             if (pos+len-1 <=src.length)

136             {

137                 length = len;

138                 this->base = new char[length+1];

139             

140                 for(int i = 0; i < length; ++i,++pos)

141                 {

142                     this->base[i] = src.base[pos-1];

143                 }

144             }

145             else

146             {

147                 length = src.length-pos+1;

148                 this->base = new char[length+1];

149                 int j = 0;

150                 for (;j<length;++j,++pos)

151                 {

152                     this->base[j] = src.base[pos-1];

153                 }

154                 this->base[j] = '\0';

155             }

156         }

157 

158     }

159     else

160     {

161         std::cout<<"The string is empty!"<<std::endl;

162     }

163 }

164 

165 void mString::deleteString(int pos,int len)

166 {

167     if (0 == length)

168     {

169         std::cout<<"The string is empty!"<<std::endl;

170     }

171     else

172     {

173         if (pos>length)

174         {

175             std::cout<<"The location of pos is illegal!"<<std::endl;

176         }

177         else

178         {

179             if (pos+len-1>=length) //delete all char after pos,

180                                    //but it don't move any char

181             {

182                 int i = pos - 1;

183                 for (;i<length;++i)

184                 {

185                     base[i] = '\0';

186                 }

187             }

188             else                   //pos+len-1<length,we have to move the char that

189                                    //from pos+len to length 

190             {

191                 int i = pos-1,j=pos+len-1,k=length-(pos+len)+1;

192                 for (;k>0;--k,++i,++j)

193                 {

194                     base[i] = base[j];

195                 }

196                 for (int m = len,n = length;m>0;--n,--m)

197                 {

198                     base[n-1] = '\0';

199                 }

200             }

201         }

202         

203     }

204 }

205 

206 void mString::insertString(int pos,const mString &ms)//insert ms before pos

207 {

208     if (0!=length&&0!=ms.length)

209     {

210         if (pos>length)

211         {

212             std::cout<<"The location of pos is illegal!"<<std::endl;

213         }

214         else

215         {

216             int len = ms.length,i = length-1,j=length+len-1,k = length-pos+1;

217             int m = pos,n=0;

218             base = (char *)realloc(base,(length+len)*sizeof(char));

219             length = length+len;

220             if (base==NULL)

221             {

222                 std::cout<<"Create memory is failed!"<<std::endl;

223             }

224             for (;k>0;--k,--i,--j)

225             {

226                 base[j] = base[i];

227             }

228             base[length]='\0';

229             for (;n<len;++m,++n)

230             {

231                 base[m-1] = ms.base[n];

232             }

233         }

234     }

235     else

236     {

237         std::cout<<"The string is empty!"<<std::endl;

238     }

239 }

240 

241 int  mString::indexkfString(const mString &mt,int pos)

242 {

243     if (length != 0 &&mt.length!=0)

244     {

245         if (pos>length-mt.length+1)

246         {

247             std::cout<<"The location of pos is illegal!"<<std::endl;

248             return 0;

249         }

250         else

251         {

252             int i = 1,j = pos;

253             while(i<=mt.length&&j<=length)

254             {

255                 if (mt.base[i-1]==base[j-1])

256                 {

257                     ++i;

258                     ++j;

259                 }

260                 else

261                 {

262                     j = j-i+2;

263                     i = 1;            //it's wrong if example : i = 1; j =j-i+2;

264                     if (j>length-mt.length +1)

265                     {

266                         break;

267                     }

268                 }

269             }

270             if (i > mt.length)

271             {

272                 return (j-i+1);

273             }

274             else

275             {

276                 return 0;

277             }

278         }

279     }

280     else

281     {

282         std::cout<<"The string is empty!"<<std::endl;

283         return 0;

284     }

285 }

286 

287 int  mString::indexkmpString(const mString &mt,int pos,int *next)

288 {

289     int i = pos,j = 0;

290     nextSt(mt,next);

291     while(j<mt.length&&i<=length)

292     {

293         if (j == -1||mt.base[j]==base[i-1])

294         {

295             ++i;

296             ++j;           

297         }

298         else

299         {

300             j = next[j];         

301         }    

302     }

303     if (j==mt.length)

304     {

305         std::cout<<i-j<<std::endl;

306         return (i - j);

307     }

308     else

309     {

310         std::cout<<"nothing"<<std::endl;

311         return 0;

312     }

313 }

314 

315 void mString::nextSt(const mString& mt,int *next)

316 {

317     int i = 0,j = -1;

318     next[0] = -1;

319     while (i<mt.length)

320     {

321         if (j==-1||mt.base[i]==mt.base[j])

322         {

323             ++i;

324             ++j;

325             next[i] = j;      

326         }

327         else

328         {

329             j = next[j];

330         }

331     }

332     //for (int i = 0;i<mt.length;++i)

333     //{

334         //std::cout<<next[i];

335     //}

336 }

337 

338 void mString::replaceString(int repos,const mString& mt,const mString &mv,int *next)

339 {

340     if (length!=0)

341     {

342         int pos = repos;

343         if (mt.length!=0&&mv.length!=0)

344         {

345             int pps = pos;

346             while(pos!=0)

347             {

348                 pos = indexkmpString(mt,pps,next);

349                 if (pos!=0)                              //when pos == 0,maybe execute copy in the head

350                 {                                        //example;a = "abcaabcacbc";mt = "bc";mv = "ff";

351                     insaftposString(pos,mt,mv);          //but the result is; "fffaaffacff".

352                 }

353                 pps = pos+mv.length;            //from  pos+mv.length 

354             }

355         }

356         else

357         {

358             std::cout<<"The string of mt or mv  is empty!"<<std::endl;

359         }

360 

361     }

362     else

363     {

364         std::cout<<"The main string is empty!"<<std::endl;

365     }

366 

367 }

368 

369 void mString::insaftposString(int pps,const mString& mt,const mString& mv)

370 {

371     if (mt.length<mv.length)

372     {

373         int n   = length - (pps+mt.length-1);       //the sum of movement

374         int dis = mv.length - mt.length;

375         int k   = length+dis-1;

376         int j   = length-1;

377         base = (char *)realloc(base,(length+dis)*sizeof(char));

378         length = length+dis;

379         if (base==NULL)

380         {

381             std::cout<<"Create memory is failed!"<<std::endl;

382         }

383         for (int i = 1;i<=n;++i,--k,--j)

384         {

385             base[k] = base[j];

386         }

387         base[length] = '\0';

388         for (int i = 0,j=pps-1;i<mv.length;++i,++j)

389         {

390             base[j] = mv.base[i];

391         }

392     }

393     else if (mt.length>mv.length)

394     {

395         int n = length - (pps+mt.length-1);

396         int dis = mt.length-mv.length;

397         int i = pps+mv.length-1;

398         int j = pps+mt.length-1;

399         for (int k = pps-1,l = 0;l<mv.length;++l,++k)

400         {

401             base[k] = mv.base[l];

402         }

403         for (int k=1;k<=n;++k,++i,++j)

404         {

405             base[i]=base[j];

406         }

407         for (int k=1,l = length-1;k<=dis;++k)

408         {

409             base[l] = '\0';

410         }

411         length = length-dis;

412     }

413     else

414     {

415         for (int i = 0;i<mv.length;++i,++pps)

416         {

417             base[pps-1] = mv.base[i];

418         }

419         printString();//inserts without thinks

420     }

421 

422 }

以上代码都经过正确测试

这里仅仅列出对kmp算法应用的测试。

 1 #include "hstring.h"

 2 

 3 

 4 int main(void)

 5 {

 6     char d[100];

 7     char e[10];

 8     char f[10];

 9     std::cout<<"Please Enter a string!"<<std::endl;

10     std::cin>>d;

11     std::cout<<"Please Enter a string mt"<<std::endl;

12     std::cin>>e;

13     std::cout<<"Please Enter a string mt"<<std::endl;

14     std::cin>>f;

15     char *p1 = d; //= "abcaabcacbcabc";

16     char *p2 = e;//"abc";

17     char *p3 = f;//"ffff";

18     int p[100];

19     mString a,b,c;

20     a.newString(p1);

21     b.newString(p2);

22     c.newString(p3);

23     a.replaceString(1,b,c,p);

24     //int p[88];

25     //a.indexkmpString(b,1,p);

26     //std::cout<<a.indexkfString(b,2);

27     //a.insertString(4,b);

28     //a.deleteString(1,4);

29     //c.subString(a,2,3);

30     a.printString();

31     //c.concatString(a,b);

32     //b.printString();

33     //a.clearStirng();

34     //std::cout<<a.isEmpty();

35     //std::cout<<a.lengthString();

36     //std::cout<<compareString(a,b);

37      system("pause");

38     return 0;

39 }

测试结果:

kmp字符串替换操作测试

你可能感兴趣的:(C++)