数据结构--串

news/2024/9/21 12:45:07

文章目录

    • 串的基本概念
    • 串的基本操作
    • 代码实现

串的基本概念

长度:串中字符的个数,称为串的长度。
空串:长度为零的字符串称为空串。
空格串:由一个或多个连续空格组成的串称为空格串。
串相等:两个串相等,是指两个串的长度相等且对应的字符都相等。
子串:串中任意连续的字符组成的子序列称为该串的子串。
主串:包含子串的串为该子串的主串。

串的基本操作

生成等值字符串
复制字符串
求字符串长度
打印
比较大小
字符串连接
返回从第n个字符起的子串
在第n个字符前插入字符串
从第n个字符起删除子串
返回字符的位置

代码实现

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct string							//顺序串的结构体
{char ch[MAXSIZE + 1];int length;
}string;int StringAssign(string* S, char chs[])				//生成一个其值等于字符串常量chs的串S
{int i = 0;while (chs[i] != '\0')							//循环,将字符串常量的值赋值给S{S->ch[i] = chs[i];++i;}S->length = i;									//将i赋值给S的长度return 0;
}void StringCopy(string* S1, string* S2)			//将串S2复制到串S1
{int i = 0;for (i = 0; i < S2->length; i++)			//循环 复制字符{S1->ch[i] = S2->ch[i];}S1->length = S2->length;				//复制长度
}int LengthString(string* S)					//求串S的长度
{return S->length;
}int ShowString(string* S)					//打印串S
{if (S->length == 0){printf("当前串为空!\n");return 0;}int i;for (i = 0; i < S->length; i++){printf("%c", S->ch[i]);}printf("\n");return 0;
}int StringCompare(string* S1, string* S2)				//比较串S1和串S2
{														//若S1 = S2,则返回0int i = 0;											//若S1 > S2,则返回1while ((i < S1->length) && (i < S2->length))		//若S1 < S2,则返回-1{if ((int)(S1->ch[i]) > (int)(S2->ch[i]))		//将字符强制转换为整型比较大小return 1;if ((int)(S1->ch[i]) < (int)(S2->ch[i]))return -1;if (S1->ch[i] == S2->ch[i]){++i;continue;								//如果两字符相等,则退出该次循环,进行下一次循环}++i;}if ((i == S1->length) && (i != S2->length))return -1;else if ((i != S1->length) && (i == S2->length))return 1;elsereturn 0;
}int ConcatString(string* S, string* S1, string* S2)			//用S返回由S1和S2连接而成的新串
{int i, j;for (i = 0; i < S1->length; i++)			//循环,首先将S1复制到串S{S->ch[i] = S1->ch[i];}S->length = S1->length;for (j = 0; j < S2->length; j++)			//再次循环,将S2复制到串S{S->ch[S->length] = S2->ch[j];++S->length;}return 0;
}int SubString(string* Sub, string* S, int pos, int len)		//用Sub返回串S的第pos个字符起长度为len的子串
{if ((1 > pos) || (pos > S->length) || (len < 0) || (len > S->length - pos + 1)){printf("输入有误!\n");return 0;}int j = 0;while (j < len){Sub->ch[j] = S->ch[pos - 1];++j;++pos;}Sub->length = len;return 0;
}int StrInsert(string* S1, int pos, string* S2)		//在串S1的第pos个字符之前插入串S2
{if (pos < 1 || (pos > S1->length)){printf("输入有误!\n");return 0;}int i;for (i = (S1->length - 1); i >= pos - 1; i--)	//循环,将S1从第pos个字符往后的{												//所有字符都后移S2->length个位置S1->ch[i + S2->length] = S1->ch[i];}int j = 0;int k = pos - 1;for (j = 0; j < S2->length; j++)			//循环,将串S2依次插入到S1移动后空出来的位置{S1->ch[k] = S2->ch[j];k++;}S1->length += S2->length;					//更新S1的长度return 0;
}int StrDelete(string* S, int pos, int len)			//从串S中删除第pos个字符起长度为len的子串
{if (pos < 1 || pos >(S->length - len + 1)){printf("输入有误!\n");return 0;}int i;for (i = pos + len; i <= S->length; i++){S->ch[i - len - 1] = S->ch[i - 1];}S->length -= len;						//更新S的长度,超过S->length后的字符会被省略return 0;
}//朴素的模式匹配算法
int Index(string* S, string* T, int pos)		//返回子串T在主串S中第pos个字符之后的位置,若不存在,返回0
{if (pos < 1 || pos > S->length){printf("输入有误!");return 0;}int i = pos;int j = 0;while (i <= S->length && j <= T->length){if (S->ch[i - 1] == T->ch[j]){++i;++j;}else{i = i - j + 1;				//i退回到上次匹配首位的下一位j = 0;}}if (j == T->length)return i - T->length;elsereturn 0;
}void get_next(string* T, int* next)			//计算出当前要匹配的串T的next数组
{int i, j;i = 1;j = 0;next[1] = 0;while (i < T->length){if (j == 0 || T->ch[i - 1] == T->ch[j]){++i;++j;next[i] = j;}elsej = next[j];}
}
//KMP模式匹配算法
int Index_KMP(string* S, string* T, int pos)  //返回子串T在主串S中第pos个字符之后的位置,若不存在,返回0
{int i = pos;int j = 0;int next[255];get_next(T, next);while (i <= S->length && j <= T->length){if (j == 0 || S->ch[i] == T->ch[j]){++i;++j;}else{j = next[j];}}if (j > T->length)return i - T->length;elsereturn 0;
}int main()
{string S;string T;string N;string M;string G;string L;char ch[] = { "hello world" };char ch1[] = { "hello" };char ch2[] = { "hello worldd" };StringAssign(&S, ch);StringAssign(&N, ch1);StringAssign(&M, ch2);printf("S串:");ShowString(&S);printf("当前S串的长度为%d\n", LengthString(&S));printf("N串:");ShowString(&N);printf("当前N串的长度为%d\n", LengthString(&N));printf("M串:");ShowString(&M);printf("当前M串的长度为%d\n", LengthString(&M));StringCopy(&T, &S);printf("将S串复制到T串\nT串:");ShowString(&T);printf("当前T串的长度为%d\n", LengthString(&T));printf("比较串的大小:0代表相等,1代表第一个串比第二个串大,-1代表第一个串比第二个串小\n");printf("S串与T串:%d\n", StringCompare(&S, &T));printf("S串与N串:%d\n", StringCompare(&S, &N));printf("S串与M串:%d\n", StringCompare(&S, &M));printf("将N串和M串连接成新串G\n");ConcatString(&G, &N, &M);printf("G串:");ShowString(&G);printf("当前G串的长度为%d\n", LengthString(&G));SubString(&L, &S, 7, 5);printf("显示S串中第7个字符起长度为5的子串L:");ShowString(&L);StrInsert(&N, 3, &L);printf("在N串第3个字符之前插入L串,插入后的N串为:");ShowString(&N);printf("当前N串的长度为%d\n", LengthString(&N));StrDelete(&N, 3, 5);printf("删除第三个字符起长度为5的子串后,N:");ShowString(&N);printf("当前N串的长度为%d\n", LengthString(&N));printf("(朴素模式匹配算法)子串L在主串S中的位置为%d\n", Index(&S, &L, 1));printf("(KMP模式匹配算法)子串L在主串S中的位置为%d\n", Index_KMP(&S, &L, 1));system("pause");return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/17628.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

5,ORM组件XCode(动手)

本篇才真正是XCode教程第一篇。《速览》是为了以最简洁的语言最短小的篇幅去吸引开发者&#xff1b;《简介》则是对XCode组件和XCode开发模式的一个整体介绍&#xff0c;让开发者从宏观的角度去理解XCode&#xff1b;《共舞》把XCode提到了一个新的高度&#xff0c;让开发者感受…

使用Python,OpenCV追踪对象的轨迹,来确定其移动方向

这篇博客是上一篇博客: 使用Python,OpenCV转换颜色空间,追踪对象的轨迹的扩展。将使用Python,OpenCV追踪对象的轨迹,来确定其移动方向; 虽然球跟踪展示了目标检测和跟踪的基础知识,但无法计算球的实际移动方向。通过在两个单独的帧中简单地计算对象(x,y)坐标之间的增…

组合数容斥原理

文章目录组合数devu鲜花组合数 for(int i0;i<2000;i){for(int j0;j<i;j){if(!j) f[i][j]1;else f[i][j](f[i-1][j-1]f[i-1][j])%mod;}}快速幂 int quick_pow(int a, int k, int p) {int res 1;while (k){if (k & 1) res (LL)res * a % p;a (LL)a * a % p;k >&…

使用Python进行视频流OCR

这篇博客将介绍如何使用Python,进行视频流OCR; Optical Character Recognition OCR光学字符识别 之前的博客介绍了如何使用快速傅立叶变换(FFT)检测图像和文档中的模糊。使用这种方法,能够检测出模糊、低质量的图像,然后提醒用户应该尝试捕获更高质量的版本,以便能够对其…

递归C++

文章目录什么是递归递归算法特点主要递归总结什么是递归 递归算法是一种直接或者间接调用自身方法的算法。简言之&#xff1a;在定义自身的同时又出现自身的直接或间接调用。 递归算法特点 递归算法解决问题的特点&#xff1a; 1&#xff09;递归就是方法里调用自身。 2&…

[摘]终于找到一个有助理解left/right/full outer join的例子

近日在学习《Understading DB2》的时候找到了一个例子&#xff0c;对于理解 left/right/full 三种 outer join 的大有裨益。 先看样本数据&#xff0c;来自DB2的示例数据库 sample&#xff1a; db2 > insert into employee values(99999,killkill,N,Huang,null,null,null,no…

pickle.load,pickle.dump构建Coco数据集labels的pickle文件

1. 效果图 write pickle: coco_classes.pickle done loading: coco_classes.pickle [person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, traffic light, fire hydrant, stop sign, parking meter, bench, bird, cat, dog, horse, sheep, cow, elephant, …

数据结构--树和二叉树

文章目录树和二叉树树1.树的定义2.树的逻辑表示3.树的基本术语&#xff1a;4.树的性质5.树的基本运算二叉树二叉树的存储结构二叉树的遍历树和二叉树 树 1.树的定义 2.树的逻辑表示 树形表示法文氏图表示法凹入图表示法括号表示法3.树的基本术语&#xff1a; 1‘结点的度&am…