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;

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为s2600t java_华为S2600T存储+华为RH2288H V3服务器

面对复杂多变的国际形势和国内艰巨繁重的改革发展稳定任务&#xff0c;维持稳定就显得格外重要。平安城市视频监控建设项目为了保证城市交通和城市治安的安全&#xff0c;需要对人员集中的重要场所和道路上监控进行建设和改造。视频监控记录的数据必须具有很高的安全性&#xf…

华为java8_Java8 Stream

简单认识Java streamJava8出了一个stream流式编程&#xff0c;在开发中或多或少用到接触过。怎么说呢&#xff01;举个例子把&#xff0c;一起我们在遍历一个集合的时候&#xff0c;我们是从外部去遍历的&#xff0c;然后才能拿到结果&#xff0c;这样来效率就会变得相对低一点…

c++ mysql 配置文件_C++操作数据库写入到json配置文件中

1. 这次加了对int和varchar的处理#include #include #include #include #include "json/json.h"#include #include using namespace std;int main(int argc, char* argv[]){MYSQL mysql;mysql_init( &mysql );mysql_real_connect(&mysql,"192.168.16.11…

求最长单调子序列java,单调减子序列(java实现)

题目&#xff1a;从一个由N个整数排列组成的整数序列中&#xff0c;自左向右不连续的选出一组整数&#xff0c;可以组成一个单调减小的子序列(如从{68 69 54 64 68 64 70 67 78 62 98 87}中我们可以选取出{69 68 64 62}这个子序列&#xff1b;当然&#xff0c;这里还有很多其他…

php输出12个月,php获取12个月内的开始时间和结束时间

$currentTime time();$cyear floor(date("Y",$currentTime));$cMonth floor(date("m",$currentTime));for($i0;$i<6;$i){$nMonth $cMonth-$i;$cyear $nMonth 0 ? ($cyear-1) : $cyear;$nMonth $nMonth < 0 ? 12$nMonth : $nMonth;$date $c…

java打开输入框,java – 在Android中打开输入对话框

我想在某个点打开一个输入对话框,我可以在其输入后存储和使用它.我在互联网上找到的所有例子都非常先进,我想它们并不像我想要的那样简单 – 我只需要类似于Java的东西&#xff1a;String name JOptionPane.showInputDialog("Enter your name");保留输入以供以后计算…

php 编译原理,编译原理

编译原理是计算机科学中历史最悠久&#xff0c;也是最高度发展的学科之一。编译器的设计与实现集中体现了计算机科学中的最核心的思想和技术&#xff0c;并且和计算机科学的其他研究领域&#xff0c;如形式语言与自动机、算法、数据结构、程序设计语言、计算机体系结构、软件工…

java俄文xml解析错误,XML解析出错处理

搜索热词正常解析完毕之后会直接走parserDidEndDocument这个方法解析出错之后会执行一个相应的方法&#xff0c;- (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError&#xff0c;执行完毕此方法后.会根据解析出错的地方去执行方法parserDidEndDocume…

JAVA中自己写的util中的chop,Java StringUtils.chop方法代碼示例

import org.apache.commons.lang3.StringUtils; //導入方法依賴的package包/類/*** Tutti i file dentro a /res vengono indicati come cacheabili lato browser per 1 anno (tramite lheader expires).* Per evitare che nuove versioni non vengano mai prese, si usa il &q…

ascii码扩展 php,php与ascii码

首先 简单说一下历史&#xff0c;ascii码最开始是美国人搞出来的&#xff0c;用来干什么呢&#xff1f;我们知道&#xff0c;计算机只知道0和1&#xff0c;如果我们要计算机识别除了01之外的字符&#xff0c;例如 a&#xff0c;我们要先告诉计算机‘1100001’就是a。跟摩斯密码…

php手机电子相册,免费电子相册制作软件 手机电子相册制作软件

照片配上音乐加上炫酷的过渡效果点缀图片和文字说明&#xff0c;轻松制作成各种视频格式的电子相册。不需要专业的视频制作知识&#xff0c;点几下鼠标就可以把上百张数码照片制作成电子相册。视频相册可以在电脑上用播放器收看或者在高清电视上播放。也可以刻录成DVD、VCD光盘…

windows上配置nginx php,Windows下配置Nginx使之支持PHP

1. 首先&#xff0c;将 nginx.conf 中的 PHP 配置注释去掉。01# pass the PHP scripts to FastCGI server listening on 127.0.0.1:900002#03#location ~ .php$ {04# root html;05# fastcgi_pass 127.0.0.1:9000;06# fastcgi_index index.php;07# fas…

php 系统环境变量引用,PHP 系统变量 环境变量

在PHP网站开发中&#xff0c;为了满足网站的需要&#xff0c;时常需要对PHP环境变量进行设置和应用&#xff0c;在虚拟主机环境下&#xff0c;有时我们更需要通过PHP环境变量操作函 数来对PHP环境变量值进行设置。为此我们有必要对PHP环境变量先有所熟悉。今天和大家分享PHP环境…

python dataframe分组求和,pandas datafram中按特定月份分组和求和值

这里有一个稍微不同的方法&#xff1a;使用year和month来构建索引&#xff0c;然后使用一个UDF groupby()。在示例数据&#xff1a;N 10years pd.date_range("1981", "2017", freq"A").yeardates np.random.choice(years, sizeN, replaceTrue…

matlab7.0 run,新手求救啊!!!matlab7.0在win7启动后命令窗口出现大段代码!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼java.lang.NoClassDefFoundError: com/mathworks/beans/ExtraPropertyAttributesat java.lang.ClassLoader.defineClass0(Native Method)at java.lang.ClassLoader.defineClass(Unknown Source)at java.security.SecureClassLoader…

php+spl+栈,PHP SPL标准库之数据结构栈(SplStack)介绍

栈(Stack)是一种特殊的线性表&#xff0c;因为它只能在线性表的一端进行插入或删除元素(即进栈和出栈)SplStack就是继承双链表(SplDoublyLinkedList)实现栈。类摘要如下&#xff1a;简单使用如下&#xff1a;//把栈想象成一个颠倒的数组$stack new SplStack();/*** 可见栈和双…

深度理解java jvm,深度理解JVM

深入理解java虚拟机要讲的内容了解历史垃圾回收机制性能监控工具性能调优案例实战认识类的文件结构类加载机制字节码执行引擎虚拟机编译及运行时优化Java线程高级1. 环境搭建安装jdk2. 内存溢出场景模拟public class Test01 {public static void main(String[] args) {//测试内…

php用json_encode编码后乱码,php json_encode()函数中文编码乱码解决方法_PHP教程

在我使用php json_encode()时&#xff0c;如果是英文或数字没一点问题&#xff0c;但是用到中文是居然出现不可识别的中文乱码了&#xff0c;下面看我解决json_encode中文乱码方法。在网上找到一种解决方法&#xff1a;代码如下复制代码后来请教了别人&#xff0c;还可以用base…

oracle 根据用户备份,Oracle基于用户的备份及恢复

要执行exp或imp命令&#xff0c;首先&#xff1a; 1.看Oracle安装目录的bin目录下有没有 exp.exe和 imp.exe这两个文件&#xff0c;要不然可能无法执行这个命令的要执行exp或imp命令&#xff0c;首先&#xff1a;1.看Oracle安装目录的bin目录下有没有 exp.exe和 imp.exe这两个文…