数据结构-数组、字符串

本文介绍了C语言中的数组概念,包括数组的定义、初始化以及如何获取数组长度。同时涵盖了字符串的定义、存储方式以及BF和KMP算法在字符串匹配中的应用。
摘要由CSDN通过智能技术生成

一、数组

  1. C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。

  2. 数组是相同数据类型变量的集合。类型可以是 int 整形、char 字符、float double 浮点型。

  3. 当我们要记录10个数据时,可以只需声明一个大小为10,元素类型为 int 数组,无需声明10个变量。
    在 C 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:

    int arr [5] = {1,2,3,4,5};

大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。

  1. 所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

  2. //特别注意的是位序是从1开始的,而下标是从0开始的。
    例如:
    位序: 1 2 3 4 5
    下标: 0 1 2 3 4

访问数组元素
#include <stdio.h>
int main()
{
int n[10]; // n 是一个包含 10 个整数的数组
int i, j;

示例
// 初始化数组元素
for (i = 0; i < 10; i++)
{
n[i] = i + 1; // 设置元素 i 为 i + 1
}
for (j = 0; j < 10; j++) // 输出数组中每个元素的值
{
printf(" %d\n", j, n[j]);
}

return 0;

}

获取数组长度
数组长度可以使用 sizeof 运算符来获取数组的长度,例如:
#include <stdio.h>

int main() {
int arr[] = { 1, 2, 3, 4, 5 };
int length = sizeof(arr)

printf(" %d\n", length);

return 0;

}

二、字符串

字符串或串是由数字、字母、下划线组成的一串字符。它是编程语言中表示文本的数据类型。
1.串
是由字符组成的有限序列
//长度为0的串称为 空串
//由空格组成的串称为空格串

  1. 例如 “abcdef” 为主串,则"abc"为子串

  2. 串为线性表的一种,共有3种存储方法。
    (1)定长顺序存储
    提前申请一个内存空间,往里面存数据。
    //注意:字符串结尾默认会有一个\0,所以申请一个能存10个字符的串,
    最终只有9个字符能用

(2)堆分配存储
1. 根据数据的大小动态地分配空间
2. “堆” 空间是从系统中一个连续的叫“堆”的自由存储区分配出来的。

(3)链式存储
1.同“链表”里面全是数据节点,一个数据节点可以存一个字符,也
可以存多个字符。
2.如果一个节点放一个字符的话, 优点是操作方便,缺点是存储密度 低。可一个节点放多个字符。

//存储密度 = 串值所占的存储 / 实际分配的存储

4、串的匹配模式
 BF 算法(简单匹配方法)
 1. 设主串(正文串)长度为s,子串(模式串)长度为t。
 2.算法的思路是从主串的每个字符开始依次与子串进行匹配。
   //将主串与子串的一个字符比较,若相等,继续逐个比较后续字符;
   若不等,从主串下个字符开始,重新与子串一个字符比较。

int index_BF(SString S, SString T,int pos )
{
int i = pos, j = 1;
while (i <= S.length && j <=T.length)
{
if (s.ch[i] == t.ch[j])
{
++i;
j++; //主串s和子串依次匹配下一个字符

       else         
            i = i - j + 2;
            j = 1;
         }                                        //子串、主串指针回溯重新开始下一次匹配
     if (j >= t.length)     
           return i - t.length ;                  //返回匹配的第一个字符的下标
    else
         return 0;                                //模式匹配不成功

}
2. BF算法的算法复杂度为 O (n*m)
//时间复杂度就是用来方便开发者估算出程序的运行时间

KMP算法
1.比BF优点是主串的指针不必回溯,算法复杂度为O(n+m)
2.根据next值求nextval值的方法:

模式串: a b a a b c a c
next值: 0 1 1 2 2 3 1 2
nextval值: 0 1 0 2 1 3 0 2
1.第一位的nextval值必定为0,第二位如果于第一位相同则为0,如果不同则为1。
2.第三位的next值为1,那么将第三位和第一位进行比较,均为a,相同,则第三位的nextva值为第一位的next值,为0。
3.第四位的next值为2,那么将第四位和第二位进行比较,不同,则第四位的nextval值为其next值,为2。
4.第五位的next值为2,那么将第五位和第二位进行比较,相同,第二位的next值为1,则继续将第二位与第一位进行比较,不同,则第五位的nextval值为第二位的next值,为1。5.第六位的next值为3,那么将第六位和第三位进行比较,不同,则第六位的nextval值为其next值,为3。
6.第七位的next值为1,那么将第七位和第一位进行比较,则第七位的nextval值为0.,相同7.第八位的next值为2,那么将第八位和第二位进行比较,不同,则第八位的nextval值为其next值,为2。

总结

以上就是今天要讲的内容,希望以上内容对大家的学习有所帮助,希望大家多多支持,
祝大家学习有成!

  • 28
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值