初级数据结构——串

目录

  • 前言
  • 一、串的定义
  • 二、串的存储结构
  • 三、串的基本操作
  • 四、串的模式匹配
  • 五、串的应用
  • 六、c++代码模版
  • 七、经典例题
    • 1.汉字统计
      • 代码题解
    • 2.查找最大元素
      • 代码题解
    • 3.首字母变大写
      • 代码题解
  • 八、总结
  • 结语

前言

这期我们一起深入学习初级数据结构——串,数据结构中的串(String)是一种非常常见且基础的数据类型,它由零个或多个字符组成的有限序列。以下是对数据结构串的详细分析:

在这里插入图片描述

一、串的定义

串是由零个或多个字符组成的有限序列,一般记为S=“a1a2…an”(n>=0),其中S是串名,双引号(或单引号)括起来的字符序列是串的值,ai(1<=i<=n)可以是字母、数字或其他字符,n称为串的长度。当n=0时,称为空串。此外,只包含空格的串被称为空格串,它与空串的区别在于空格串有内容有长度。

二、串的存储结构

串的存储结构主要有以下几种:

定长顺序存储结构:为每个串变量分配一个固定长度的存储区,即定长数组。这种存储方式需要预定义一个最大串长,当实际串长超过这个预定义长度时,会发生截断。

堆分配存储结构:仍然以一组地址连续的存储单元存放串值的字符序列,但它们的存储空间是在程序执行过程中动态分配得到的。这种方式可以克服定长顺序存储结构中串长受限的弊端。

链式存储结构:类似于线性表的链式存储结构,也可采用链表方式存储串值。由于串的特殊性(每个元素只有一个字符),在具体实现时,每个结点既可以存放一个字符,也可以存放多个字符。每个结点称为块,整个链表称为块链结构。

三、串的基本操作

串的基本操作主要包括以下几种:

1.赋值操作:为串变量赋值。
2.复制操作:由串S复制得到串T。
3.判空操作:判断串是否为空。
4.比较操作:比较两个串的大小。
5.求串长操作:返回串的长度。
6.求子串操作:返回串S的第pos个字符起长度为len的子串。
7.串联接操作:用T返回由S1和S2联接而成的新串。
8.定位操作:若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现的位置;否则返回0。
9.清空操作:清空串的内容。
10.销毁串操作:销毁串并释放其占用的存储空间。

四、串的模式匹配

串的模式匹配是串操作中的一个重要问题,它求的是子串(常称模式串)在主串中的位置。常见的模式匹配算法有:

暴力匹配算法:一种简单直接的字符串匹配算法。它的基本思想是从主串的第一个字符开始,与模式串进行逐个字符比较,若匹配失败,则将模式串右移一位,继续比较,直到找到匹配或者主串被遍历完为止。该算法的时间复杂度为O(n*m),其中n为主串的长度,m为模式串的长度。

KMP算法:一种高效的字符串匹配算法。它通过预处理模式串,利用模式串中的信息在匹配失败时尽可能地减少比较次数,从而提高匹配效率。KMP算法的核心思想是利用模式串内部的信息,在匹配失败时根据已匹配的部分,选择合适的位置进行模式串的移动。算法的关键在于部分匹配表(Next数组),它记录了模式串每个位置之前的子串中有多大长度的相同前缀和后缀。匹配过程中,当文本串的某个字符与模式串的对应字符不匹配时,利用Next数组确定模式串的移动位置,从而减少不必要的比较。KMP算法的时间复杂度为O(n+m)。

五、串的应用

串在编程中广泛应用,用于处理文本数据、用户界面、文件操作、网络通信等各种任务。它们也用于数据存储和传输。例如,在文本编辑器中,串操作被用于实现文本的查找、替换、插入和删除等功能;在搜索引擎中,串匹配算法被用于实现关键词的快速检索;在数据库系统中,串操作被用于实现数据的存储、检索和更新等功能。

六、c++代码模版

#include<iostream>
#include<cstring>
#include<string>

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
using namespace std;

class String {
private:
	char* str;
	size_t length;//表示字符串长度
public:
	String();//无参构造函数
	String(const String& s);//拷贝构造函数
	String(const char* s);//有参构造函数
	~String();//析构函数
	size_t getLength()const;
	char operator[] (size_t index) const;//运算符重载[]
	String& operator=(const String& s);//运算符重载=
	bool operator==(const String& s)const;//布尔类型==
	bool operator!=(const String& s)const;//布尔类型!=
	String copy() const;//字符串的拷贝
	String operator+(const String& s)const;
	bool empty();
	friend ostream& operator<<(ostream& out, const String& s);//运算符重载<<
};

String::String() {//构造一个空串的函数
	length = 0;//字符串长度为0
	str = new char[1];//申请一个char类型的内存空间
	str[0] = '\0';//'\0'这个代表空串
}

String::String(const String& s) {
	length = s.length;
	str = new char[length + 1];
	strcpy(str, s.str);
}

String::String(const char* s) {
	length = strlen(s);
	str = new char[length + 1];
	strcpy(str, s);
}

String::~String() {
	delete[]str;
}

size_t String::getLength() const {
	return length;
}

char String::operator[] (size_t index) const {
	return str[index];
}

String& String::operator=(const String& s) {//这个操作其实就是赋值操作
	if (this != &s) {//如果当前对象不等于传参对象
		delete[]str;//如果发现s不等于这个类本身的地址那么就释放掉str避免内存泄漏
		length = s.length;
		str = new char[length + 1];
		strcpy(str, s.str);
	}
	return *this;
}

bool String::operator==(const String& s) const {
	return strcmp(str, s.str) == 0;//如果这两个对象值相等就等于0
}

bool String::operator!=(const String& s) const {
	return strcmp(str, s.str) != 0;
}

String String::copy() const {
	String s = *this;
	return s;
}

String String::operator+(const String& s) const {
	String ret;
	ret.length = this->length + s.length;
	ret.str = new char[ret.length + 1];
	strcpy(ret.str, str);
	strcat(ret.str, s.str);//将s拷贝到ret的结尾
	return ret;
}

bool String::empty() {
	return length == 0;
}

ostream& operator<<(ostream& out, const String& s) {
	out << s.str;//out代表输出流的类型,将s对内容传到out的输出流中,函数返回输出流
	return out;
}

int main() {
	String s = "1234";
	String s1 = "567";
	cout << s[0] << endl;
	s = s + s1;
	cout << s << endl;
	cout << (s == s1) << endl;
	cout << (s != s1) << endl;
	cout << s.empty() << endl;
	return 0;
}

七、经典例题

1.汉字统计

(蓝色字体点进去看原题)

代码题解

#include<iostream>
#include<string>
using namespace std;


int main() {
	int t;
	cin >> t;
	char s[500];
	getchar();//把空格也算入字符
	while (t--) {
		gets_s(s);
		int len = strlen(s);
		int cnt = 0;
		for (int i = 0; i < len; i++) {
			if (s[i] < 0)cnt++;
		}
		cout << cnt / 2 << endl;//汉字占两个字节
	}

	return 0;
}

2.查找最大元素

代码题解

#include<iostream>
#include<string>
using namespace std;


int main() {
	string s;
	while (cin >> s) {
		int max = 0;
		string ret;
		for (int i = 0; i < s.size(); i++) {
			if (s[i] > max)max = s[i];
		}
		for (int i = 0; i < s.size(); i++) {
			ret += s[i];
			if (s[i] == max)ret += "(max)";
		}
		cout << ret << endl;
	}

	return 0;
}

3.首字母变大写

代码题解

#include<iostream>
#include<cstring>
#include<string>
using namespace std;


int main() {
	char s[110];
	while (gets_s(s)) {
		int len = strlen(s);
		for (int i = 0; i < len; i++) {
			if (i == 0  || s[i - 1] == ' ') {
				if (s[i] != ' ') {
					if (s[i] >= 'a' && s[i] <= 'z') {
						s[i] -= 'a';
						s[i] += 'A';
					}
				}
			}
		}
		printf("%s\n", s);
	}

	return 0;
}

八、总结

综上所述,数据结构串是一种非常重要且基础的数据类型,在编程和算法设计中具有广泛的应用和重要的地位。

结语

通过此次学习相信大家已经对串有了更深刻的理解,希望大家多刷题巩固知识点,下期我会更新串的题库。

在这里插入图片描述

想看更多内容可以关注我,看我作品,关注我让我们一起学习编程,希望大家能点赞关注支持一下,让我有持续更新的动力,谢谢大家

在这里插入图片描述

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

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

相关文章

【K8S系列】Kubernetes Pod节点ImagePullBackOff 状态及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;当某个 Pod 的容器无法从指定的镜像仓库拉取镜像时&#xff0c;Pod 的状态会变为 ImagePullBackOff。这通常是因为指定的镜像不存在、镜像标签错误、认证失败或网络问题等原因。 以下是关于 ImagePullBackOff 的详细分析及解决方案。 1. ImagePull…

CSS3新特性——字体图标、2D、3D变换、过渡、动画、多列布局

目录 一、Web字体 二、字体图标 三、2D变换 1.位移 &#xff08;1&#xff09;浮动 &#xff08;2&#xff09;相对定位 &#xff08;3)绝对定位和固定定位 &#xff08;4&#xff09;位移 用位移实现盒子的水平垂直居中 2.缩放 利用缩放调整字体到12px以下&#xff…

前端项目规范~

前言 项目一般都是几个开发一起迭代升级&#xff0c;那肯定存在各种代码风格、格式化以及命名等等&#xff0c;懂得都懂&#x1f4a9;&#xff0c;所以项目规范就凸显出来了呀&#xff0c;以下主要是介绍工具自动化使用~ husky 安装husky pnpm add --save-dev husky .husk…

【编译器】Dev C++建立C语言工程

【编译器】Dev C建立C语言工程 文章目录 [TOC](文章目录) 前言一、创建工程二、添加.c.h三、主函数处理四、在桌面中打开exe文件五、参考资料总结 前言 在使用了很多编译器之后&#xff0c; 要么是太大了&#xff0c; 要么是太新了&#xff0c; 要么是在线编译器&#xff0c;用…

CHIMA网络安全攻防大赛经验分享

比赛模式 第一轮&#xff1a;20分钟基础知识赛&#xff08;50道题&#xff09; 安全运维&#xff0c;法律法规&#xff0c;linux操作系统等 第二轮&#xff1a;50分钟CTF夺旗&#xff08;5道题&#xff09; 题目涵盖 密码学 运用多种工具&#xff0c;如ASCII对照&#xff0c…

基于yolov8、yolov5的植物类别识别系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 &#xff0c; 直接提供最少两个训练好的模型。模型十分重要&#xff0c;因为有些同学的电脑没有 GPU&#xff0…

JavaWeb开发10

多表设计 一对多 关系实现&#xff1a;在数据库表中多的一方添加字段来关联一的一方的主键 外键约束 一对一 关系&#xff1a;一对一关系&#xff0c;多用于单表拆分&#xff0c;将一张表的基础字段放在一张表中&#xff0c;其他字段放在另一张表中&#xff0c;以提高操作…

leetcode-12-整数转罗马数字

题解&#xff1a; 1、初始化字典&#xff1a; 2、 代码&#xff1a;

Seatunnel解决Excel中无法将数字类型转换成字符串类型以及源码打包

需求 需要实现将Excel中的数字类型的单元格像数据库中字符串类型的字段中推送 问题原因 Seatunnel在读取字段类型的时候都是使用强转的形式去获取数据的 假如说数据类型不一样的话直接强转就会报错 修改位置 org/apache/seatunnel/api/table/type/SeaTunnelRow.java org…

Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程

环境&#xff1a; keil版本为5.38&#xff0c;版本务必高于5.30 STM32F4的pack包版本要高于2.9 软件包下载地址&#xff1a;https://zhuanlan.zhihu.com/p/262507061 一、更改Keil中编译器 更改后编译&#xff0c;会报很多错&#xff0c;先不管。 二、更改头文件依赖 观察…

JeecgBoot 与分布式事务 Seata v1.7.0 集成实战

准备环境 一、创建四个数据库&#xff0c;如下 jeecg_order&#xff08;订单数据库&#xff09; jeecg_account&#xff08;账户数据库&#xff09; jeecg_product&#xff08;商品数据库&#xff09; seata&#xff08;seata数据库&#xff09;以上数据库脚本已存放至 jeecg…

鸿蒙动画开发07——粒子动画

1、概 述 粒子动画是在一定范围内随机生成的大量粒子产生运动而组成的动画。 动画元素是一个个粒子&#xff0c;这些粒子可以是圆点、图片。我们可以通过对粒子在颜色、透明度、大小、速度、加速度、自旋角度等维度变化做动画&#xff0c;来营造一种氛围感&#xff0c;比如下…

MAC创建一个自动操作,启动系统【睡眠】功能,并将绑定快捷键

目的 通过 Automator 创建一个服务来启动系统【睡眠】这个功能&#xff0c;并绑定快捷键。 步骤一&#xff1a;创建 Automator 服务 打开 Automator&#xff1a; ○ 在 Spotlight 中搜索 Automator&#xff0c;然后打开。选择服务类型&#xff1a; ○ 在 Automator 的启动界…

基于AIRTEST和Jmeter、Postman的自动化测试框架

基于目前项目和团队技术升级&#xff0c;采用了UI自动化和接口自动化联动数据&#xff0c;进行相关测试活动&#xff0c;获得更好的测试质量和测试结果。

HarmonyOS4+NEXT星河版入门与项目实战------Button组件

文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、运行效果4、总结1、控件图解 这里我们用一张完整的图来汇整 Button 的用法格式、属性和事件,如下所示: 按钮默认类型就是胶囊类型。 2、案例实现 这里我们实现一个根据放大和缩小按钮来改变图片大小的功能。 功…

5、深入剖析PyTorch DataLoader源码

文章目录 1. 重要类2. DataSet3. DataLoader4. Python实例 参考大神B站&#xff0c;记录学习笔记 5、深入剖析PyTorch DataLoader源码 其他大神笔记&#xff1a; pytorch数据操作—dataset&#xff0c;dataloader&#xff0c;transform 1. 重要类 Data LoaderDatasetSampleRa…

D74【 python 接口自动化学习】- python 基础之HTTP

day74 http基础定义 学习日期&#xff1a;20241120 学习目标&#xff1a;http定义及实战 -- http基础介绍 学习笔记&#xff1a; HTTP定义 HTTP 是一个协议&#xff08;服务器传输超文本到浏览器的传送协议&#xff09;&#xff0c;是基于 TCP/IP 通信协议来传递数据&…

非对称之美(贪心)

非对称之美(贪心) import java.util.*; public class Main{public static void main(String[] arg) {Scanner in new Scanner(System.in);char[] ch in.next().toCharArray(); int n ch.length; int flag 1;for(int i 1; i < n; i) {if(ch[i] ! ch[0]) {flag …

Rust derive macro(Rust #[derive])Rust派生宏

参考文章&#xff1a;附录 D&#xff1a;派生特征 trait 文章目录 Rust 中的派生宏 #[derive]基础使用示例&#xff1a;派生 Debug 派生其他常用特征示例&#xff1a;派生 Clone 和 Copy 派生宏的限制和自定义派生自定义派生宏上面代码运行时报错了&#xff0c;以下是解释 结论…

WebStorm 2022.3.2/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理

WebStorm 2022.3.2/IntelliJ IDEA 2024.3出现elementUI提示未知 HTML 标记、组件引用爆红等问题处理 1. 标题识别elementUI组件爆红 这个原因是&#xff1a; 在官网说明里&#xff0c;才版本2024.1开始&#xff0c;默认启用的 Vue Language Server&#xff0c;但是在 Vue 2 项…