首页 > 其他分享 >数据结构:串

数据结构:串

时间:2025-01-02 20:59:24浏览次数:3  
标签:ch String int s2 s1 len 数据结构

文章目录

串的基本概念

1.串长:串的长度(字符个数)称作串长。
2.空串:长度为0的字符串。
3.主串:包含所有子串的串为主串。
4.子串:串中任意连续的字符组成的子序列称为该串的子串。

串的相关操作

串的操作有生成串,复制串,串连接,求串长,求子串位置,求子串,串比较,插入串,删除串,打印串等等。

串的代码与运行结果

string的结构体:

typedef struct String {
	char ch[MaxSize + 1];//'\0'
	int len;
}String;

初始化string:

void InitString(String& s) {
	s.len = 0;
	s.ch[0] = '\0';
}

创造string:

void CreateSting(String& s) {
	cin.getline(s.ch, MaxSize + 1);//cin会在读取空格时终止
	int i = 0;
	while (s.ch[i++] != '\0') {
		s.len++;
	}
}

复制string:

void CopyString(String& s1, String& s2) {
	int i = 0;
	for (int i = 0; i < s2.len; i++) {
		s1.ch[i] = s2.ch[i];
	}
	s1.len = s2.len;
	s1.ch[s1.len] = '\0';
}

拼接string:

String ConcatString(String& s1, String& s2) {
	String s;
	InitString(s);
	int i = 0;
	for (i = 0; i < s1.len; i++) {
		s.ch[i] = s1.ch[i];
	}
	for (int j = 0; j < s2.len; j++) {
		s.ch[i + j] = s2.ch[j];
	}
	s.len = s1.len + s2.len;
	s.ch[s.len] = '\0'; 
	return s;
}

获取长度:

int GetLen(String& s) {
	int length = 0;
	int i = 0;
	while (s.ch[i] != '\0') {
		length++;
		i++;
	}
	return length;
}

寻找子串位置:

int GetSubstringPos(String& s1, String& s2) {
	if (s2.len > s1.len) {
		return 0;
	}
	for (int i = 0; i < s1.len-s2.len; i++) {
		for (int j = 0; j < s2.len; j++) {
			if (s1.ch[i + j] != s2.ch[j]) {
				break;
			}
			if (j==s2.len-1) {
				return 1;
			}
		}
	}
	return 0;
}

比较string:

int CmpString(String& s1, String& s2) {
	int mins = min(s1.len, s2.len);
	for (int i = 0; i < mins; i++) {
		if (s1.ch[i] > s2.ch[i]) {
			return 1;
		}
		if (s1.ch[i] < s2.len) {
			return -1;
		}
	}
	if (s1.len == s2.len) {
		return 0;
	}
	if (s1.len > s2.len) {
		return 1;
	}
	return -1;
}

插入串:

String InsertString(String& s1, String& s2, int pos) {
	String S;
	InitString(S);
	if (pos<=0 || pos>s1.len+1) {
		cout << "Conduct error" << endl;
		return S;
	}
	int i = 0;
	for (i; i < pos-1; i++) {
		S.ch[i] = s1.ch[i];
	}
	int j = i;
	int k = 0;
	for (j; j < i + s2.len; j++) {
		S.ch[j] = s2.ch[k++];
	}
	for (j; j < s1.len + s2.len; j++) {
		S.ch[j] = s1.ch[i++];
	}
	S.len = s1.len + s2.len;
	S.ch[S.len] = '\0';
	return S;
}

删除串:

String DeleteString(String& s, int pos,int len ) {
	String S;
	InitString(S);
	if (pos<1 || pos>s.len||pos+len-1>s.len) {
		cout << "Conduct error" << endl;
		return S;
	}
	int index = pos - 1;
	int i;
	for ( i = 0; i < index; i++) {
		S.ch[i] = s.ch[i];
	}
	int j = i;
	for (i+=len;i<s.len;i++) {
		S.ch[j++] = s.ch[i];
	}
	S.len = j;
	S.ch[S.len] = '\0';
	return S;
}

打印串:

void PrintString(String& s) {
for (int i = 0; i < s.len; i++) {
		cout << s.ch[i] ;
	}
	cout << endl;
}

完整代码如下:

#include<iostream>
#define MaxSize 100
using namespace std;
typedef struct String {
	char ch[MaxSize + 1];//'\0'
	int len;
}String;
void InitString(String& s) {
	s.len = 0;
	s.ch[0] = '\0';
}
void CreateSting(String& s) {
	cin.getline(s.ch, MaxSize + 1);//cin会在读取空格时终止
	int i = 0;
	while (s.ch[i++] != '\0') {
		s.len++;
	}
}
void CopyString(String& s1, String& s2) {
	int i = 0;
	for (int i = 0; i < s2.len; i++) {
		s1.ch[i] = s2.ch[i];
	}
	s1.len = s2.len;
	s1.ch[s1.len] = '\0';
}
String ConcatString(String& s1, String& s2) {
	String s;
	InitString(s);
	int i = 0;
	for (i = 0; i < s1.len; i++) {
		s.ch[i] = s1.ch[i];
	}
	for (int j = 0; j < s2.len; j++) {
		s.ch[i + j] = s2.ch[j];
	}
	s.len = s1.len + s2.len;
	s.ch[s.len] = '\0'; 
	return s;
}
int GetLen(String& s) {
	int length = 0;
	int i = 0;
	while (s.ch[i] != '\0') {
		length++;
		i++;
	}
	return length;
}
int GetSubstringPos(String& s1, String& s2) {
	if (s2.len > s1.len) {
		return 0;
	}
	for (int i = 0; i < s1.len-s2.len; i++) {
		for (int j = 0; j < s2.len; j++) {
			if (s1.ch[i + j] != s2.ch[j]) {
				break;
			}
			if (j==s2.len-1) {
				return 1;
			}
		}
	}
	return 0;
}
int CmpString(String& s1, String& s2) {
	int mins = min(s1.len, s2.len);
	for (int i = 0; i < mins; i++) {
		if (s1.ch[i] > s2.ch[i]) {
			return 1;
		}
		if (s1.ch[i] < s2.len) {
			return -1;
		}
	}
	if (s1.len == s2.len) {
		return 0;
	}
	if (s1.len > s2.len) {
		return 1;
	}
	return -1;
}
String InsertString(String& s1, String& s2, int pos) {
	String S;
	InitString(S);
	if (pos<=0 || pos>s1.len+1) {
		cout << "Conduct error" << endl;
		return S;
	}
	int i = 0;
	for (i; i < pos-1; i++) {
		S.ch[i] = s1.ch[i];
	}
	int j = i;
	int k = 0;
	for (j; j < i + s2.len; j++) {
		S.ch[j] = s2.ch[k++];
	}
	for (j; j < s1.len + s2.len; j++) {
		S.ch[j] = s1.ch[i++];
	}
	S.len = s1.len + s2.len;
	S.ch[S.len] = '\0';
	return S;
}
String DeleteString(String& s, int pos,int len ) {
	String S;
	InitString(S);
	if (pos<1 || pos>s.len||pos+len-1>s.len) {
		cout << "Conduct error" << endl;
		return S;
	}
	int index = pos - 1;
	int i;
	for ( i = 0; i < index; i++) {
		S.ch[i] = s.ch[i];
	}
	int j = i;
	for (i+=len;i<s.len;i++) {
		S.ch[j++] = s.ch[i];
	}
	S.len = j;
	S.ch[S.len] = '\0';
	return S;
}
void PrintString(String& s) {
for (int i = 0; i < s.len; i++) {
		cout << s.ch[i] ;
	}
	cout << endl;
}
int main() {
	String s1;
	InitString(s1);
	CreateSting(s1);
	PrintString(s1);
	cout << GetLen(s1) << endl;
	String s2;
	CopyString(s2, s1);
	PrintString(s2);
	cout << CmpString(s1, s2) << endl;
	String s3 = ConcatString(s1, s2);
	PrintString(s3);
	String s4 = InsertString(s1, s2, 2);
	PrintString(s4);
	String s5 = DeleteString(s1, 3, 2);
	PrintString(s5);
	String s6;
	InitString(s6);
	CreateSting(s6);
	cout << GetSubstringPos(s4,s6)<<endl;
	return 0;
}

运行结果如下:
在这里插入图片描述
下期补充kmp算法。

标签:ch,String,int,s2,s1,len,数据结构
From: https://blog.csdn.net/2402_87224981/article/details/144859250

相关文章

  • 【初阶数据结构与算法】排序算法总结篇(每个小节后面有源码)(直接插入、希尔、选择、堆
    文章目录一、直接插入排序二、希尔排序三、直接选择排序四、堆排序五、冒泡排序六、快速排序七、归并排序八、计数排序九、非递归快速排序十、非递归归并排序本篇内容将从稳定性与复杂度等角度分析排序算法,列出它们的特点、优点以及缺点,希望大家有所收获,如果想更加细......
  • [数据结构学习笔记2] 大O法表示程序的时间复杂度
    程序运行都是需要时间的,我们用大O法来表示,程序在最坏情况下,运行时间和输入规模的关系。一般有这么几种大O时间:快:闪电:O(1)-常量复杂度-和输入无关;比如通过数组下标访问元素;简单数学运算,如看末尾数字是否是基数;火箭:O(logn)-对数复杂度-时间增长随数字规模增长缓慢;这种......
  • [数据结构学习笔记1] 为什么需要有数据结构
    程序本质上就是用来读取数据,然后操作数据,最后生成数据的。如果数据能被有效,或者有结构的展现,那将极大方便程序操作。举例:我们家里有很多工具,剪刀,锤子,斧头,扳手,放大镜,六角扳手,螺丝刀,尺子,卷尺,螺丝,便利贴等等。我们可以怎样收纳这些工具,使得我们后续可以方便的使用呢?第一种,我们家有......
  • Java-数据结构-包装类与泛型
    一、包装类Java的包装类指的是将基本数据类型(如int、float、boolean等)封装成对象的类。Java中的8个基本数据类型(byte、short、int、long、float、double、char、boolean)都有对应的包装类。①基本数据类型对应的包装类基本数据类型包装类byteByteshortShortintIntegerlongLo......
  • 【数据结构】线性表
    目录线性表的定义及特点线性表的特点线性数据结构的特点线性表的定义顺序表定义和初始化操作存储方式初始化操作 其他操作查找插入删除 应用(合并操作)集合的合并操作两个顺序表的合并操作 链表单链表 定义及存储表示其他操作 创建前插法后插法 查......
  • 数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)
    查找(检索):定义:从给定的数据中找到对应的K1,顺序查找:O(n)的从前向后的遍历2,对半查找,要求有序从中间开始查找,每次检查中间的是否正确,不正确就根据性质去左边or右边找2.1对半插入排序在找位置的时候是logn去找,但是最后需要换位置排序之后仍然是O()N^2)对同一序列分别......
  • 数据结构复习 (二叉查找树,高度平衡树AVL)
    1.二叉查找树:为了更好的实现动态的查找(可以插入/删除),并且不超过logn的时间下达成目的定义:二叉查找树(亦称二叉搜索树、二叉排序树)是一棵二叉树,其各结点关键词互异,且中根序列按其关键词递增排列。等价描述:二叉查找树中任一结点P,其左子树中结点的关键词都小于P的关键词......
  • 数据结构与算法Python版 拓扑排序与强连通分支
    文章目录一、图的应用-拓扑排序二、图的应用-强连通分支一、图的应用-拓扑排序拓扑排序TopologicalSort从工作流程图得到工作次序排列的算法,称为“拓扑排序”拓扑排序处理一个有向无环图DAG,输出顶点的线性序列。使得两个顶点v,w,如果图中有(v,w)边,在线性序列中v就......
  • 数据结构—树的定义与性质
    目录1.树的定义2.基本术语3.树的性质1.树的定义 树是n(n≥0)个结点的有限集。n=0时,称为空树。(1)树有且只有一个特定的结点,称为根节点。(2)当n>1时,其余结点可分为n(n>0)个互不相交的有限集T1,T2……Tm,其中每个集合本身又是一棵树,称为根的子树。2.基本术语1)祖先、子孙......
  • 数据结构考前总结
    数据结构重点Java和Cpp代码可以互相调用,cpp指针对应Java的引用,灵活转换就可以最短路径算法会考。这个意思是不是说,可能会考察编程?(感觉大概率会考dijkstra算法)汉诺塔,可能会考一个选择题代码要看清楚,以及求一个递推式//ABC//递归的想法,先把n-1层放到B上......