数据结构的C++实现之字符串的基本操作

字符串(string)是由0个或多个字符组成的有限序列。一般使用顺序存储结构,末尾以'\0'表示结束,但不计 入字符串的长度。

示例程序:(改编自《大话数据结构》)

#include<iostream>using namespace std;
#define MAXSIZE 20
  typedef char String[MAXSIZE + 1]; //以'\0'结尾
  /* 生成一个串*/
  bool StrAssign(String Dest, char *ptr)
  {
  cout << "Assign Str ..." << endl;
  int i;
  for (i = 0; ptr[i] != '\0' && i < MAXSIZE; i++)
  Dest[i] = ptr[i];
  Dest[i] = '\0';
  return true;
  }
  /* 拷贝一个字符串 */
  bool StrCopy(String Dest, String Src)
  {
  cout << "Copy Str ..." << endl;
  int i;
  for (i = 0; Src[i] != '\0' && i < MAXSIZE; i++)
  Dest[i] = Src[i];
  Dest[i] = '\0';
  return true;
  }

int StrLength(String Src)
  {
  int i = 0;
  while (Src[i] != '\0')
  i++;
  return i;
  }

bool StrEmpty(String Src)
  {
  if (StrLength(Src) == 0)
  return true;
  else
  return false;

}
  /* 若Str1>Str2,则返回值>0;若Str1=Str2,则返回值=0;若Str1<Str2,则返回值<0 */
  int StrCompare(String Str1, String Str2)
  {
  int len1 = StrLength(Str1);
  int len2 = StrLength(Str2);
  for (int i = 0; i < len1 && i < len2; i++)
  if (Str1[i] != Str2[i])
  return Str1[i] - Str2[i];
  return len1 - len2;
  }

bool ClearString(String Src)
  {
  for (int i = 0; Src[i] != '\0'; i++)
  Src[i] = '\0';
  return true;
  }
  /* 用Dest返回Str1和Str2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
  bool StrConcate(String Dest, String Str1, String Str2)
  {
  cout << "Concate String ..." << endl;
  if (StrLength(Str1) + StrLength(Str2) <= MAXSIZE)
  {
  /* 未截断 */
  int i, j;
  for (i = 0; Str1[i] != '\0'; i++)
  Dest[i] = Str1[i];
  j = i;
  for (i = 0; Str2[i] != '\0'; i++, j++)
  Dest[j] = Str2[i];
  Dest[j] = '\0';
  return true;
  }
  else //截断Str2
  {
  int i, j;
  for (i = 0; Str1[i] != '\0'; i++)
  Dest[i] = Str1[i];
  j = i;
  for (i = 0; Str2[i] != '\0' && j <= MAXSIZE - 1; i++, j++)
  Dest[j] = Str2[i];
  Dest[j] = '\0';
  return false;
  }

}
  /* 用Sub返回串Src的第pos个字符起长度为len的子串。 */
  bool SubString(String Sub, String Src, int pos, int len)
  {
  /*cout<<"Get SubString ..."<<endl;*/
  if (pos < 1 || pos > StrLength(Src) ||
  len < 0 || len > StrLength(Src) - pos + 1)
  return false;
  int i;
  for (i = 0; i <= len - 1; i++)
  Sub[i] = Src[i + pos - 1];
  Sub[i] = '\0';
  return true;
  }
  /* 返回子串Sub在主串Src中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
  int Index1(String Src, String Sub, int pos)
  {
  int len1 = StrLength(Src);
  int len2 = StrLength(Sub);
  int i = pos;
  String sub;
  if (pos > 0)
  {
  while (i <= len1 - len2 + 1)
  {
  SubString(sub, Src, i, len2);
  /* 如果两串相等 , 则返回i值 */
  if (StrCompare(Sub, sub) == 0)
  return i;
  else/* 如果两串不相等,前进位置 */
  i++;
  }
  }
  return 0;
  }

int Index2(String Src, String Sub, int pos)
  {
  int i = pos - 1;
  int j = 0;
  int len1 = StrLength(Src);
  int len2 = StrLength(Sub);
  while (i <= len1 - 1 && j <= len2 - 1)
  {
  if (Src[i] == Sub[j])/* 两字母相等则继续 */
  {
  ++i;
  ++j;
  }
  else
  {
  /* i退回到上次匹配首位的下一位 */
  i = i - j + 1;
  j = 0;/* j退回到子串Sub的首位 */
  }
  }

if (j == len2) //子串已经遍历完毕
  return i - len2 + 1;
  else
  return 0;
  }
  /* 在串Src的第pos个字符之前插入串In。完全插入返回TRUE,部分插入返回FALSE */
  bool StrInsert(String Src, int pos, String In)
  {
  int i;
  int len1 = StrLength(Src);
  int len2 = StrLength(In);
  if (pos < 1 || pos > len1 + 1)
  return false;

if (len1 + len2 <= MAXSIZE)
  {
  /* 完全插入 */
  for (i = len1; i >= pos - 1; i--)
  Src[i + len2] = Src[i];
  for (i = pos - 1; i < pos + len2 - 1; i++)
  Src[i] = In[i - pos + 1];
  if (pos == len1 + 1) //末尾插入,最后添加'\0'
  Src[i] = '\0';
  return true;
  }

else
  {
  /* 部分插入,In截断 */
  for (i = MAXSIZE; i > pos; i--)
  Src[i] = Src[pos + i - MAXSIZE];

for (i = 0; i < MAXSIZE - pos; i++)
  Src[pos - 1 + i] = In[i];
  return false;
  }
  }
  /* 从串Src中删除第pos个字符起长度为len的子串 */
  bool StrDelete(String Src, int pos, int len)
  {
  int i;
  if (pos < 1 || pos > StrLength(Src) - len + 1 || len < 0)
  return false;
  for (i = pos + len - 1; i <= StrLength(Src); i++)
  Src[i - len] = Src[i];
  return true;
  }
  /* 用Re替换主串Src中出现的所有与Sub相等的不重叠的子串 */
  bool StrReplace(String Src, String Sub, String Re)
  {
  int i = 1;/* 从串Src的第一个字符起查找串Sub */
  if (StrEmpty(Sub))
  return false;
  do
  {
  i = Index1(Src, Sub, i);/* 结果i为从上一个i之后找到的子串Sub的位置 */

if (i)
  {
  StrDelete(Src, i, StrLength(Sub));/* 删除该串Sub */
  StrInsert(Src, i, Re); /* 在原串Sub的位置插入串Re */
  i += StrLength(Re);/* 在插入的串Re后面继续查找串Sub */
  }

}
  while (i);

return true;
  }

void StrPrint(String Src)
  {
  cout << "Print Str ..." << endl;
  for (int i = 0; Src[i] != '\0'; i++)
  cout << Src[i];
  cout << endl;

}

int main(void)
  {
  String Str1;
  StrAssign(Str1, "ILOVEYOU");
  StrPrint(Str1);

String Str2;
  StrCopy(Str2, Str1);
  StrPrint(Str2);

if (!StrEmpty(Str1))
  cout << "Str1's Length : " << StrLength(Str1) << endl;

String Str3;
  StrAssign(Str3, "ILOVEyou");

if (StrCompare(Str1, Str3) > 0)
  cout << "Str1 > Str3" << endl;
  else if (StrCompare(Str1, Str3) == 0)
  cout << "Str1 = Str3" << endl;
  else
  cout << "Str1 < Str3" << endl;

String Str4, Str5;
  StrAssign(Str4, " HLZ");
  StrConcate(Str5, Str1, Str4);
  StrPrint(Str5);

String Str6;
  cout << "Get SubString ..." << endl;
  SubString(Str6, Str5, 1, 8);
  StrPrint(Str6);

cout << "Index of (Str5, Str4) " << Index2(Str5, Str4, 2) << endl;

StrInsert(Str6, 9, " HLZ");
  StrPrint(Str6);
  StrInsert(Str6, 8, " HLZ");
  StrPrint(Str6);

StrDelete(Str5, 2, 4);
  StrPrint(Str5);

String Str7, Str8;
  StrAssign(Str7, "ILOVEJDWSOVEDSOVEde");
  StrAssign(Str8, "OVE");
  StrReplace(Str7, Str8, "ove");
  StrPrint(Str7);

return 0;
  }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 数据结构
, string
, 字符串
, maxsize
, 顺序串c++
基本操作
字符串的基本操作、字符串基本操作、单链表基本操作的实现、二叉树基本操作的实现、图的基本操作与实现,以便于您获取更多的相关知识。

时间: 2025-01-20 09:38:06

数据结构的C++实现之字符串的基本操作的相关文章

数据结构与算法复习:ADT树基本操作

复习记录,高手无视,关于 二叉搜索树的一些基本操作. //Code by Pnig0s1992 //Date:2012,3,28 #include <stdio.h> #include <stdlib.h> typedef int Element_type; typedef struct TreeNode * ptrTreeNode; typedef struct TreeNode * ADTTree; struct TreeNode { Element_type element;

字符串的基本操作

String类的概述 String类的构造方法 String类的判断功能 String类的获取功能 String类的转换功能 String其他类型互转汇总 其它类型转成String类型 String类型转成其它类型 StringStringBuffer与StringBuilder之间区别 StringBuffer常用方法StringBuilder的省略 执行速度比较 StringBuilder与 StringBuffer String类的概述 JDK提供的API,查看String类的说明可以看到

数据结构 c++语言-顺序表上的基本操作实现

问题描述 顺序表上的基本操作实现 求大神补充一下逆置操作,顺便将注释补上.求问此处return -1:是什么意思?顺序表上的基本操作实现 时 限: 1000 ms 内存限制: 10000 K 总时限: 3000 ms 描述: 在顺序存储结构实现基本操作:初始化.创建.插入.删除.查找.遍历.逆置.合并运算. 输入: 请输入线性表La的长度:na1 a2 a3 ...an(数值有序,为降序)请输入要插入到线性表La中的数字x和插入的位置i:x i请输入要删除数字的位置:i请输入要查找的数字:x请输

Python列表(list)、字典(dict)、字符串(string)基本操作小结_python

创建列表 复制代码 代码如下: sample_list = ['a',1,('a','b')] Python 列表操作 复制代码 代码如下: sample_list = ['a','b',0,1,3] 得到列表中的某一个值 复制代码 代码如下: value_start = sample_list[0] end_value = sample_list[-1] 删除列表的第一个值 复制代码 代码如下: del sample_list[0] 在列表中插入一个值 复制代码 代码如下: sample_li

【转】数据结构链表操作之双链表的基本操作

//Node.h 声明类Node#ifndef Node_H#define Node_H template <class T>class LinkList;       //为是Node类的友员类而声明 template <class T>class Node{   public:            friend class LinkList<T>;   //将LinkList类设为友元类   private:         T data;      Node&l

link中为什么说字符串是只读的,但是我可以改变字符串,这是怎么回事?

问题描述 link中为什么说字符串是只读的,但是我可以改变字符串,这是怎么回事? link中为什么说字符串是只读的,但是我可以改变字符串,这是怎么回事? 解决方案 字符串本来就是只读的.但是它的运算符重载过了,所以用+连接字符串,或者用=赋值,会自动产生一个新的字符串,而不会改变之前的那个. 解决方案二: string是一种很特殊的数据类型,它既是基元类型又是引用类型,在编译以及运行时,.Net都对它做了一些优化工作,正式这些优化工作有时会迷惑编程人员,使string看起来难以琢磨,这篇文章分上

Ruby中操作字符串的一些基本方法_ruby专题

 在Ruby中的String对象持有和操纵的任意序列的一个或多个字节,通常表示人类语言的字符表示. 简单的字符串文本括在单引号(单引号字符).引号内的文本的字符串值: 'This is a simple Ruby string literal' 如果需要内放置一个单引号,单引号的字符串文字,在它前面加上一个反斜杠Ruby解释器不认为终止字符串: 'Won\'t you read O\'Reilly\'s book?' 反斜杠也可以转义另一个反斜杠,这样第二个反斜杠本身不是解释为转义字符. 以下是

数据结构 有关多维数组的问题

问题描述 数据结构 有关多维数组的问题 int main(){ nArray A(2, 3, 4); } /******************************/ template class nArray{ private: aElem* base; int dim; int * bounds; int * constants; private: Status Locate(va_list, int&); public: nArray(int, ...); ~nArray(){ if

我的五年百度博客文章列表(带链接版)

五年前,懵懵懂懂进入百度空间,五年后,总结一下在百度上贡献的文章(技术贴)以及收藏的文章.数了数大约450篇. name   urlservlet过滤器2 解决用户非法在线filter http://hi.baidu.com/ae6623/item/617c46c5a96b6dd196445292servlet过滤器1 解决字符集乱码filter  http://hi.baidu.com/ae6623/item/a006f07f0813c615d1dcb366GBK和UTF-8之间的战争,web