串,即字符串。计算机上的非数值处理的对象基本上是字符串数据。但是,由于现在我们使用的计算机硬件结构主要是反映数值计算的需要的,在处理字符串数据时比处理整数和浮点数要复杂的多。而且,对于不同类型程序,所处理的字符串具有不同的特点,要有效地实现字符串的处理,就必须根据具体情况使用合适的存储结构。串的存储表示主要有:1.定长顺序存储表示; 2. 堆分配存储表示; 3.块链存储表示。

以下介绍比较简单的定长顺序存储表示。

串定长顺序存储表示,说白了,就是用以个固定长度字符数组来存放。

1.定义“头部”

#define MAXSTRLEN 255 //所能定义的最大串长

typedef unsigned char SString[MAXSTRLEN + 1]; //数组中下标0的位置,用来存放,当前串的长度

2.初始化

Status InitStr(SString &T)

{

T[0] = 0;//初始化唯一要做的事。定义串当前长度为0。

return OK;

}3.把一个字符数组赋给SString。。

Status StrAssign(SString &T, char *chars)

{

int len = strlen(chars);

if (len > MAXSTRLEN)

return ERROR;

T[0] = len;

for (int i = 0; i < len; i++)

{

T[i + 1] = chars[i];

}

return OK;

}

也许看到在这,你会问,SString本身是一个字符数组,为什么又要用一个字符数组去赋给SString?

其实不然,SString相对与字符数组,已经有所不同了,它以数组中下标0的位置存放串当前的实际长度。PASCAL语言中就是使用这个串类型的表示方法。

而对于char *chars = "12345",要像把它赋给另一个字符数组如char chars1[n],那么这里的n值必须大于等于6。因为C语言在字符串末位加了'\0'作为结束标志符。但是有的编译器如gcc不检测这错误。

4.串的比较

Status StrCompare(SString S, SString T)

{

for (int i = 1; i <= S[0] && i <= T[0]; i++)

{

if (S[i] != T[i])

{

return S[i] - T[i]; //返回第一组不同的字符间的差

}

}

return T[0] - S[0];//若其中一个字符串刚好是另一个的子串,返回两字符串之间的长度差。

}

5.从S下标为pos开始,取长度len的子串Sub。

Status SubString(SString S, SString &Sub, int pos, int len)

{

if (pos < 1 || pos > S[0] || len < 1 || len > S[0] - pos + 1)

return ERROR;

Sub[0] = len;

for (int i = 1; i <= len; i++)

{

Sub[i] = S[pos + i - 1];

}

return OK;

}

6.串的合并:S1,S2合并为S

Status Contact(SString &S, SString S1, SString S2)

{

int i = 0;

int j = 0;

if (S1[0] + S2[0] <= MAXSTRLEN) //第一种情况,两串长度的和小于所定义的串的最大存储长度

{

S[0] = S1[0] + S2[0];

for (i = 1; i <= S1[0]; ++i)

S[i] = S1[i];

for (j = 1; j <= S2[0]; ++i, ++j)

S[i] = S2[j];

return OK;

} else if (S1[0] < MAXSTRLEN) //第二种情况,S1能完全存入S,S2可能被截断或者一个都不存入

{

S[0] = MAXSTRLEN;

for (i = 1; i <= S1[0]; i++)

{

S[i] = S1[i];

}

for (j = 1; i <= MAXSTRLEN; ++i, ++j)

S[i] = S2[j];

return OK;

} else) //第三种情况,连S1也被截断

{

S[0] = MAXSTRLEN;

for (i = 1; i <= MAXSTRLEN; i++)

{

S[i] = S1[i];

}

return OK;

}

}

7.模式匹配的一种改进算法:KMP算法

void get_next(SString T, int next[])

{

int i = 1;

next[1] = 0;

int j = 0;

while (i < T[0])

{

if (j == 0 || T[i] == T[j])

{

++i;//执行先++j,再执行next[i] = j。

++j;//因为是在串中第j+1字符前有长度为j的最长子串,与从首字符起长度为j的子串相等。next[i] = j;//注意其上的前提是已经T[i] == T[j]。

} else

j = next[j];

}

}//S为主串,T为要查找的模式串

Status Index_KMP(SString S, SString T, int pos)

{

int *next = new int();

get_next(T, next);

int i = pos, j = 1; //i为T开始匹配的位置 ,

while (i <= S[i] && j <= T[0])

{

if (j == 0 || S[i] == T[j])

{

++i;

++j;

} else

j = next[j];//j != 0 且 S[i] != T[j],S[i]与T[next[j]]比较

}

if (j > T[0])

return i - T[0];//匹配成功

else

return 0;

}

java 串的顺序存储_算法入门之串的顺序存储表示相关推荐

  1. java实现子序列最大和_算法入门:最大子序列和的四种算法(Java)

    最近再学习算法和数据结构,推荐一本书:Data structures and Algorithm analysis in Java 3rd 以下的四种算法出自本书 四种最大子序列和的算法: 问题描述 ...

  2. java azure blob 查询_快速入门:适用于 Java 的 Azure Blob 存储客户端库 v8 | Microsoft Docs...

    您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 快速入门:使用 Jav ...

  3. java猴子分桃_算法——猴子分桃

    想做些有关"算法"的练习题,在网上无意间看到了一道很经典的算法题--猴子分桃,于是百度了一下,才发现这道题的相关文档很多很多,但最多的也就是使用C++或者Java来解决这道题,而自 ...

  4. java 字符正则匹配算法_算法之字符串——正则表达式匹配

    难度 困难 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式 ...

  5. java矩阵连乘_算法设计与分析——矩阵连乘问题(动态规划)

    一.问题描述 引出问题之前我们先来复习一下矩阵乘积的标准算法. int ra,ca;//矩阵A的行数和列数 int rb,cb;//矩阵B的行数和列数 voidmatrixMultiply() {fo ...

  6. 通讯录排序 (20分)_算法入门篇:简单的排序算法

    作者:dorseyCh来源:http://www.imooc.com/article/264180 很久之前有过一次面试,被问到一个问题,能不能写一个冒泡排序?说实话,尽管在这之前曾经写过不少比这个更 ...

  7. java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题

    文章目录 注明:题目要求只能使用蛮力法 算法标签:全排列,枚举,二进制,dfs,数组 题目简介 思路 AC代码 方法一:字符串蛮力 方法二:二进制枚举 方法三:DFS 三.2闫老板思考角度 方法四:全 ...

  8. java年利润编程题_[编程入门]利润计算-题解(Java代码)

    ![](/image_editor_upload/20200216102044_14158.png)这也是简单的分类问题,用if进行分类后就可以用switch进行分类计算利润 代码如下: packag ...

  9. java怎么编程方程_[编程入门]自定义函数求一元二次方程-题解(Java代码)

    令一元二次方程判别式: b2 - 4ac为变量P **当P > 0时:** x1 = (-b+sqrt(P)) / 2a x1 = (-b-sqrt(P)) / 2a **当P = 0时:** ...

最新文章

  1. Nginx与Lua利用fpm打成rpm包
  2. FD.io/VPP — Overview
  3. virtualBox使用nat模式下ssh连接
  4. EOS入门指南PART6——别忙着开发,先来看看智能合约数据是怎么存的
  5. nyoj 61(双线程dp)
  6. Python 入门【常规设置】
  7. c语言链表萌新,萌新一枚,关于链表问题求大佬解答
  8. java分治_【Java算法】什么是分治算法?
  9. Spring 基于注解(annotation)的配置之@Required注解
  10. gevent 学习笔记一
  11. 【GoWeb开发实战】Beego的路由控制
  12. 2020年平均工资出炉!这个行业最高
  13. 在Hekaton里,正确选择哈希存储桶数
  14. (3)JavaScript 的注释
  15. Linux操作系统中GDB工具常见用法(二)
  16. 论文笔记_S2D.75_2021-CoRL_TANDEM_基于深度多视图立体视觉的实时跟踪和稠密建图
  17. 计算机检测不到ipod,[已解决]如何修复iTunes无法识别iPod
  18. menu什么意思中文意思_menu是什么意思
  19. 雅思口语考官常问的100个话题整理-自己整理
  20. Webpack4.0各个击破(6)loader篇

热门文章

  1. linux中如何改IP
  2. C#中IEnumerableT.Join()和IEnumerableT.GroupJoin()简单使用
  3. XShell远程连接LInux服务器(地址端口映射方法)
  4. linux常用特殊符号
  5. task2 EDA数据分析
  6. C++PrimerPlus学习——第十七章编程练习
  7. 酷狗音乐linux版_让父母也爱上音乐 酷狗音乐大字版成中老年人新宠
  8. sqlserver可视化工具_数据分析之基础分析工具篇(修订版)
  9. linux怎样写java代码,linux 怎么写java
  10. 微信公众号页面模版怎么添加文章推荐功能