java 串的顺序存储_算法入门之串的顺序存储表示
串,即字符串。计算机上的非数值处理的对象基本上是字符串数据。但是,由于现在我们使用的计算机硬件结构主要是反映数值计算的需要的,在处理字符串数据时比处理整数和浮点数要复杂的多。而且,对于不同类型程序,所处理的字符串具有不同的特点,要有效地实现字符串的处理,就必须根据具体情况使用合适的存储结构。串的存储表示主要有: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 串的顺序存储_算法入门之串的顺序存储表示相关推荐
- java实现子序列最大和_算法入门:最大子序列和的四种算法(Java)
最近再学习算法和数据结构,推荐一本书:Data structures and Algorithm analysis in Java 3rd 以下的四种算法出自本书 四种最大子序列和的算法: 问题描述 ...
- java azure blob 查询_快速入门:适用于 Java 的 Azure Blob 存储客户端库 v8 | Microsoft Docs...
您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 快速入门:使用 Jav ...
- java猴子分桃_算法——猴子分桃
想做些有关"算法"的练习题,在网上无意间看到了一道很经典的算法题--猴子分桃,于是百度了一下,才发现这道题的相关文档很多很多,但最多的也就是使用C++或者Java来解决这道题,而自 ...
- java 字符正则匹配算法_算法之字符串——正则表达式匹配
难度 困难 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式 ...
- java矩阵连乘_算法设计与分析——矩阵连乘问题(动态规划)
一.问题描述 引出问题之前我们先来复习一下矩阵乘积的标准算法. int ra,ca;//矩阵A的行数和列数 int rb,cb;//矩阵B的行数和列数 voidmatrixMultiply() {fo ...
- 通讯录排序 (20分)_算法入门篇:简单的排序算法
作者:dorseyCh来源:http://www.imooc.com/article/264180 很久之前有过一次面试,被问到一个问题,能不能写一个冒泡排序?说实话,尽管在这之前曾经写过不少比这个更 ...
- java蛮力法背包问题_[算法课]五种蛮力法解决01背包问题
文章目录 注明:题目要求只能使用蛮力法 算法标签:全排列,枚举,二进制,dfs,数组 题目简介 思路 AC代码 方法一:字符串蛮力 方法二:二进制枚举 方法三:DFS 三.2闫老板思考角度 方法四:全 ...
- java年利润编程题_[编程入门]利润计算-题解(Java代码)
![](/image_editor_upload/20200216102044_14158.png)这也是简单的分类问题,用if进行分类后就可以用switch进行分类计算利润 代码如下: packag ...
- java怎么编程方程_[编程入门]自定义函数求一元二次方程-题解(Java代码)
令一元二次方程判别式: b2 - 4ac为变量P **当P > 0时:** x1 = (-b+sqrt(P)) / 2a x1 = (-b-sqrt(P)) / 2a **当P = 0时:** ...
最新文章
- Nginx与Lua利用fpm打成rpm包
- FD.io/VPP — Overview
- virtualBox使用nat模式下ssh连接
- EOS入门指南PART6——别忙着开发,先来看看智能合约数据是怎么存的
- nyoj 61(双线程dp)
- Python 入门【常规设置】
- c语言链表萌新,萌新一枚,关于链表问题求大佬解答
- java分治_【Java算法】什么是分治算法?
- Spring 基于注解(annotation)的配置之@Required注解
- gevent 学习笔记一
- 【GoWeb开发实战】Beego的路由控制
- 2020年平均工资出炉!这个行业最高
- 在Hekaton里,正确选择哈希存储桶数
- (3)JavaScript 的注释
- Linux操作系统中GDB工具常见用法(二)
- 论文笔记_S2D.75_2021-CoRL_TANDEM_基于深度多视图立体视觉的实时跟踪和稠密建图
- 计算机检测不到ipod,[已解决]如何修复iTunes无法识别iPod
- menu什么意思中文意思_menu是什么意思
- 雅思口语考官常问的100个话题整理-自己整理
- Webpack4.0各个击破(6)loader篇
热门文章
- linux中如何改IP
- C#中IEnumerableT.Join()和IEnumerableT.GroupJoin()简单使用
- XShell远程连接LInux服务器(地址端口映射方法)
- linux常用特殊符号
- task2 EDA数据分析
- C++PrimerPlus学习——第十七章编程练习
- 酷狗音乐linux版_让父母也爱上音乐 酷狗音乐大字版成中老年人新宠
- sqlserver可视化工具_数据分析之基础分析工具篇(修订版)
- linux怎样写java代码,linux 怎么写java
- 微信公众号页面模版怎么添加文章推荐功能