数据结构之串的定长顺序存储

2024-01-03 23:20

本文主要是介绍数据结构之串的定长顺序存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、串的定义:由零个或多个字符组成的有序序列:’abcdef‘

2、串的长度:串中字符的数目称为串的长度

3、空串:’’ ‘ ’空格串

4、子串:子串包含空串和串本身,如 ab 的子串:a、b、ab 和一个空子串共 4 个

5、子串在主串中的位置:比如:a,b,c,d 为以下的 4 个串a = ‘gao’; b = ‘bo’; c = ‘gaobo’; d = ‘gao bo’;首先他们的长度分别是3,2,5,6;同时 a,b 都是 c 和 d 的子串。a 在 c 和 d 中的位置都为 0.而 b在 c 中的位置是 3,在 d 中的位置是 4. 对于串’abcd’来说,他的子串有’a’, ’b’, ’c’, ’d’, ‘ab’, ‘bc’, ‘cd’, ‘abc’, ’bcd’,‘abcd’, ‘ ’总共 11 个

6、串相等:只有当两个串的长度相等,并且各个对应位置的字符都相等时才相等。比如:串’abcdef’和’abcdef’就是相等。但是上面的 4个串 a,b,c,d 彼此都不相等。

串的定长顺序存储
串的顺序存储结构是用一组地址连续的存储单元来存储串中的字符序列的。按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。一般是用定长数组来定义。 既然是定长数组,就存在一个预定义的最大串长度。

串的定长顺序存储数据结构定义

#define SIZE 20
typedef struct Str
{
char elem[SIZE];
int length;//在串里面没有'\0'一说当前有效数据个数
}Str;

串的基本操作

void StrAssign(Str *s,const char *chars);//利用字符串初始化串
void StrCpy(Str *s,Str *t);//将串 t 拷贝到 s
bool IsEmpty(Str *s);//判断串是否为空
int GetLength(Str *s);//求串的长度
void Clear(Str *s);//串清空
//从 s 里面的第 pos 位置提取长度为 len 的子串,放到 sub 里面
bool SubStr(Str *sub,Str *s,int pos,int len);
bool Insert(Str *s,int pos,Str *t);//在 pos 位置插入 t
//在 s 里面查找子串 sub,从 pos 位置开始的第一个符合的,返回下标
int BF(Str *s,Str *sub,int pos);
//用 v 替换从 pos 位置开始的第一个 t;
bool DeletePos(Str *s,int pos,int len);//从 pos 位置开始删除 len 个长度
bool Delete(Str *s,int pos,Str *t);//从 pos 位置开始删除子串 t;
bool Replace(Str *s,Str *t,Str *v,int pos);
bool ReplaceAll(Str *s,Str *t,Str *v);//将所有的 t 替换成 v
void Show(Str *s);
void Destroy(Str *s);

头文件str.h

#pragma once
#define SIZE 20
typedef struct Str
{char elem[SIZE];int length;//在串里面没有'\0'一说当前有效数据个数
}Str;
void StrAssign(Str *s, const char *chars);//利用字符串初始化串
void StrCpy(Str *s, Str *t);//将串 t 拷贝到 s
bool IsEmpty(Str *s);//判断串是否为空
int GetLength(Str *s);//求串的长度
void Clear(Str *s);//串清空//从 s 里面的第 pos 位置提取长度为 len 的子串,放到 sub 里面
bool SubStr(Str *sub, Str *s, int pos, int len);
bool Insert(Str *s, int pos, Str *t);//在 pos 位置插入 t//在 s 里面查找子串 sub,从 pos 位置开始的第一个符合的,返回下标
int BF(Str *s, Str *sub, int pos);
//用 v 替换从 pos 位置开始的第一个 t;
bool DeletePos(Str *s, int pos, int len);//从 pos 位置开始删除 len 个长度
bool Delete(Str *s, int pos, Str *t);//从 pos 位置开始删除子串 t;
bool Replace(Str *s, Str *t, Str *v, int pos);
bool ReplaceAll(Str *s, Str *t, Str *v);//将所有的 t 替换成 v
void Show(Str *s);
void Destroy(Str *s);

源文件 str.cpp

#include"str.h"
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string>
void StrAssign(Str *s, const char *chars)//利用字符串初始化串
{assert(s != NULL&&chars != NULL);int length = strlen(chars);if (length > SIZE){return;}for (int i = 0; i < length; i++){s->elem[i] = chars[i];}s->length = length;
}
void StrCpy(Str *s, Str *t)//将串 t 拷贝到 s
{assert(s != NULL&&t != NULL);int len = t->length;if (len > SIZE){return;}for (int i = 0; i < len; i++){s->elem[i] = t->elem[i];}}
bool IsEmpty(Str *s)//判断串是否为空
{return s->length == 0;
}
int GetLength(Str *s)//求串的长度
{return s->length;
}
void Clear(Str *s)//串清空
{s->length = 0;
}//从 s 里面的第 pos 位置提取长度为 len 的子串,放到 sub 里面
bool SubStr(Str *sub, Str *s, int pos, int len)
{assert(sub != NULL&&s != NULL);if (pos<0 || pos>s->length || len > sub->length||pos+len>s->length){return false;}for (int i = 0; i < len; i++){sub->elem[i] = s->elem[i + pos];}sub->length = len;return true;
}
bool Insert(Str *s, int pos, Str *t)//在 pos 位置插入 t
{assert(s != NULL&&t != NULL);int tlen = t->length;int slen = s->length;if (pos<0  || pos + tlen>SIZE){return false;}//先将pos位置后面的数据向后挪tlen个for (int i = slen - 1; i >= pos; i--){s->elem[i + tlen] = s->elem[i];}//将t插入for (int i = 0; i < tlen; i++){s->elem[i + pos] = t->elem[i];}s->length = tlen + slen;return true;}//在 s 里面查找子串 sub,从 pos 位置开始的第一个符合的,返回下标
//从第pos位置开始 比较s与sub每一个字符 若相等则比较下一个若不相等则从第pos+1开始比较
int BF(Str *s, Str *sub, int pos)
{assert(s != NULL&&sub != NULL);if (pos<0 || pos>s->length){return -1;}int slen = s->length;int sub_len = sub->length;int i = pos;int j = 0;while (i <= slen || j <= sub_len){if (s->elem[i] == sub->elem[j]){i++;j++;}else{j = 0;i = i - j + 1;}}if (j >= sub_len){return i;}return -1;
}
//用 v 替换从 pos 位置开始的第一个 t;bool DeletePos(Str *s, int pos, int len)  //从 pos 位置开始删除 len 个长度
{assert(s != NULL);int slen = s->length;for (int i = pos; i < slen - len; i++)   // abcdef{s->elem[i] = s->elem[len + i];}s->length = slen - len;return true;
}bool Delete(Str *s, int pos, Str *t)  //从 pos 位置开始删除子串 t;
{assert(s != NULL && t != NULL);if (pos < 0 || pos > s->length){return false;}int index = BF(s, t, pos);if (index == -1){return false;}DeletePos(s, index, t->length);return true;
}bool Replace(Str *s, Str *t, Str *v, int pos)  //用 v 替换从 pos 位置开始的第一个 t;
{assert(s != NULL && t != NULL && v != NULL);int index = BF(s, t, pos);if (index == -1){return false;}DeletePos(s, index, t->length);return Insert(s, index, v);
}bool ReplaceAll(Str *s, Str *t, Str *v)  //将所有的 t 替换成 v
{assert(s != NULL && t != NULL && v != NULL);while (Replace(s, t, v, 0)) {};return true;
}void Show(Str *s)
{assert(s != NULL);int slen = s->length;for (int i = 0; i < slen; i++){printf("%c", s->elem[i]);}printf("\n");
}

这篇关于数据结构之串的定长顺序存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567389

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据,每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明: 1. 列表 (List) 列表是一种可变的有序集合,可以存放任意类型的数据。列表中的元素可以通过索

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

【数据结构入门】排序算法之交换排序与归并排序

前言         在前一篇博客,我们学习了排序算法中的插入排序和选择排序,接下来我们将继续探索交换排序与归并排序,这两个排序都是重头戏,让我们接着往下看。  一、交换排序 1.1 冒泡排序 冒泡排序是一种简单的排序算法。 1.1.1 基本思想 它的基本思想是通过相邻元素的比较和交换,让较大的元素逐渐向右移动,从而将最大的元素移动到最右边。 动画演示: 1.1.2 具体步

数据结构:线性表的顺序存储

文章目录 🍊自我介绍🍊线性表的顺序存储介绍概述例子 🍊顺序表的存储类型设计设计思路类型设计 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾” 和“内容共创官” ,现在我来为大家介绍一下有关物联网-嵌入

[数据结构]队列之顺序队列的类模板实现

队列是一种限定存取位置的线性表,允许插入的一端叫做队尾(rear),允许删除的一端叫做队首(front)。 队列具有FIFO的性质 队列的存储表示也有两种方式:基于数组的,基于列表的。基于数组的叫做顺序队列,基于列表的叫做链式队列。 一下是基于动态数组的顺序队列的模板类的实现。 顺序队列的抽象基类如下所示:只提供了接口和显式的默认构造函数和析构函数,在派生类中调用。 #i