数据结构--06字符串的基本操作

数据结构--06字符串的基本操作
数据结构--06字符串的基本操作

《数据结构》实验报告

院系光电与信息工程学院专业电子信息工程

姓名学号电话

2011级2班2013年4月22日

1.实验题目

实验6. 字符串的基本操作

2.需求分析

(1)字符串匹配。

采用顺序结构存储串,编写一个函数SubStr(str1,str2),用于判定str2是否是str1的子串。

(2)公共字符串。

问题描述编写一个函数,实现在两个已知字符串中找出所有非空最长公共子串的长度和最长公共子串的个数。

实现要求输出非空最长公共子串的长度和最长公共子串的个数。

字符串匹配:

①串长度Strlen(SString str)

②判断是否为子串SubStr(SString str1,SString str2)

公共字符串:

①串长度Strlen(SString str)

②最大公共串长度函数maxlen()

③求公共串个数函数SubStrnum()

输入形式:字符串。

3.概要设计

(1)

ADT SString{

数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0}

结构关系:R={|a i,a i+1 ∈D}

基本操作:

Strlen(SString str)

操作前提:字符串str已存在

操作结果:求str的长度

SubStr(SString str1,SString str2)

操作前提:字符串str已存在

操作结果:判断str2是不是str1的子串

}

ADT SString{

数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0}

基本操作:

Strlen(SString str)

操作前提:字符串str已存在

操作结果:求str的长度

maxlen(SString str1,SString str2,SString str)

操作前提:字符串str1,str2,str已存在

操作结果:求str1和str2的最大公共子串长度,并将该子串赋给str

SubStrnum(SString str1,SString str2)

操作前提:字符串str1,str2已存在

操作结果:求在str1中str2子串的个数

}

(2)字符串匹配:

本程序包含3个函数:

?主函数main()

?求串长函数Strlen(SString str)

?{字符串匹配函数SubStr(SString str1,SString str2)

各函数调用关系:主函数main调用其他两个函数

公共字符串:

本程序包含4个函数:

?主函数main()

?求串长函数Strlen(SString str)

?最大公共串长度函数maxlen()

?求公共串个数函数SubStrnum()

各函数调用关系:主函数main调用其他三个函数

(3)字符串匹配:

主函数的伪码

main()

{

定义SString 变量str1,str2;

输入第一个字符串;

输入第二个字符串;

调用字符串匹配函数;

输出匹配结果;

公共字符串:

主函数的伪码

main()

{定义SString 变量str1,str2,str3;

输入第一个字符串;

输入第二个字符串;

调用最大公共串长度函数,输出结果;

调用公共串个数函数,输出结果;

4.详细设计

字符串匹配:

(1)类型定义

typedef unsigned char SString[MAXSTRLEN+1];基本操作的伪码算法(1)求串长

int Strlen(SString str)

{ 定义整型变量i;

当str[i]不为空时

{i++;}

}

(2)字符串匹配

int SubStr(SString str1,SString str2){

定义int变量i,m,j,p;

n=Strlen(str1);

m=Strlen(str2);

如果n

当i<=n-1&&j<=m-1

{如果str1[i]==str2[j]

{i++;

j++;}

否则{i=i-j+1;j=0;}

如果j==m则返回1;

否则返回0;

公共字符串:

类型定义

typedef unsigned char SString[MAXSTRLEN+1];

基本操作的伪码算法

(1)求串长

int Strlen(SString str)

{ 定义整型变量i;

当str[i]不为空时

{i++;}

}

(2)最大公共串长度

int maxlen(SString str1,SString str2,SString str)

{ for循环(max=Strlen(str2);max>=0;max--){

For循环(i=0; str1[i]; i++)

For循环(j=0; str2[j]; j++)

{

For循环(h=0; str1[i+h]==str2[j+h] && (str2[j+h] || str1[i+h]); h++);

如果(h==max)

{

index = j;

For循环(i=0; i

{str[i] = str2[index++];}

str[max]='\0';

返回max;

}

}

}

(3)求公共串个数

int SubStrnum(SString str1,SString str2) {

定义变量int i=0,j=0,n,m,k=0;

n=Strlen(str1);

m=Strlen(str2);

当str1[i]不为空时{

当str2[j] 不为空时{

如果str1[i]==str2[j] 则{

i++;

j++;

}

否则{i=i-j+1;j=0;}

如果str1[i]为空{则退出循环;}}

如果str2[j]为空{k++;j=0;}

}返回k;

5.调试分析

调试时出现错误,经过检查发现在某些地方出现死循环问题。

6.使用说明

(1)字符串匹配:

程序执行过程如下:

提示用户输入第一个字符串;

用户按要求输入一个字符串;

提示用户输入第二个字符串;

用户按要求输入二个字符串;

调用字符串匹配函数,并在屏幕上显示匹配结果。

(2)公共字符串:

程序执行过程如下:

提示用户输入第一个字符串;

用户按要求输入一个字符串;

提示用户输入第二个字符串;

用户按要求输入二个字符串;

调用maxlen函数,并在屏幕上显示最大公共子串长度。

再调用SubStrnum函数分别进行比较,并将结果输出。

7.测试结果

字符串匹配:

(1)屏幕显示:请输入第一个字符串:

输入abcdefghi后,

屏幕显示:请输入第二个字符串:

输入def后,

屏幕显示:str2是str1的子串。

(2)屏幕显示:请输入第一个字符串:输入abcdefghi后,

屏幕显示:请输入第二个字符串:

输入cba后,

屏幕显示:str2不是str1的子串。

公共字符串:

屏幕显示:请输入第一个字符串:

输入abcdefghijklmn后,

屏幕显示:请输入第二个字符串:

输入abikabnmabw后,

屏幕显示:最大公共子串长度为2

公共子串个数为3

8. 参考文献

数据结构(c语言版)

9.附录

源程序文件如下:

字符串匹配:

#include

#define MAXSTRLEN 255

typedef unsigned char SString[MAXSTRLEN+1];

int Strlen(SString str)

{

int i=0;

while(str[i]!='\0')

{

i++;

}

return i;

}

int SubStr(SString str1,SString str2)

{

int i=0,j=0,n,m;

n=Strlen(str1);

m=Strlen(str2);

if(n

while(i<=n-1&&j<=m-1)

{

if(str1[i]==str2[j])

{

i++;

j++;

}

else{i=i-j+1;j=0;}

}

if(j==m)

return 1;

else return 0;

}

void main()

{

SString str1,str2;

printf("请输入第一个字符串:");

scanf("%s",str1);

printf("\n");

printf("请输入第二个字符串:");

scanf("%s",str2);

printf("\n");

if(SubStr(str1,str2))

printf("str2是str1的子串\n");

else printf("str2不是str1的子串\n");

}

公共字符串:

#include

#define MAXSTRLEN 255

typedef unsigned char SString[MAXSTRLEN+1];

int Strlen(SString str)

{

int i=0;

while(str[i]!='\0')

{

i++;

}

return i;

}

int maxlen(SString str1,SString str2,SString str)

{

int i, j, h, index, max=0;

for(max=Strlen(str2);max>=0;max--)

{

for(i=0; str1[i]; i++)

for(j=0; str2[j]; j++)

{

for(h=0; str1[i+h]==str2[j+h] && (str2[j+h] || str1[i+h]); h++);

if(h==max)

{

index = j;

for(i=0; i

{str[i] = str2[index++];}

str[max]='\0';

return max;

}

}

}

}

int SubStrnum(SString str1,SString str2)

{

int i=0,j=0,n,m,k=0;

n=Strlen(str1);

m=Strlen(str2);

while(str1[i]){

while(str2[j])

{

if(str1[i]==str2[j])

{

i++;

j++;

}

else{i=i-j+1;j=0;}

if(!str1[i]){break;}

}

if(!str2[j]){k++;j=0;}

} r eturn k;

}

void main()

{

SString str1,str2,str3;

printf("请输入第一个字符串:");

scanf("%s",str1);

printf("\n");

printf("请输入第二个字符串:");

scanf("%s",str2);

printf("\n");

printf("最大公共子串长度为%d\n",maxlen(str1,str2,str3));

printf("公共子串个数为%d\n",SubStrnum(str1,str3)>SubStrnum(str2,str3)?SubStrnum(str1,str3):SubStrnum(str2,str3) );

}

人体大脑是怎么思维导图的

人体大脑是怎么思维导图的 负责人体大脑的视觉思考和空间推理的区域是什么?大脑的顶叶。下面我们一起探讨一下人头大脑思维的秘密!人的大脑分为左脑和右脑,左脑主要负责逻辑思维,右脑主要负责形象思维。下面小编为你整理大脑是怎么思维导图,希望能帮到你。 人体大脑思维导图图片 什么是思维导图?思维导图是一种革命性的思维工具,是一种画出来的想法。简单却又极其有效!它是一幅幅帮助你了解并掌握大脑工作原理的使用说明书。它不仅能够增强使用者的记忆能力和立体思维能力(思维的层次性与联想性),而且还能增强使用者的总体规划能力。下图是一张思维导图的图例: 为什么思维导图功效如此强大?道理其实很简单。 首先,它基于对人脑的模拟,它的整个画面正像一个人大脑的结构图(分布着许多“沟”与“回”); 其次,这种模拟突出了思维内容的重心和层次; 第三,这种模拟强化了联想功能,正像大脑细胞之间无限丰富的连接; 第四,人脑对图像的加工记忆能力大约是文字的1000倍。 让你更有效地把信息放进你的大脑,或是把信息从你的大脑中取出来,一幅思维导图是最简单的方法——这就是作为一种思维工具的思维导图所要做的工作。 它是一种创造性的和有效的记笔记的方法,能够用文字将你的想法“画出来”。 所有的思维导图都有一些共同之处:它们都使用颜色;它们都有从中心发散出来的自然结构;它们都使用线条,符号,词汇和图像,遵循一套简单、基本、自然、易被大脑接受的规则。 使用思维导图,可以把一长串枯燥的信息变成彩色的、容易记忆的、有高度组织性的图画,它与我们大脑处理事物的自然方式相吻合。 思维训练相关文章: 1.思维训练 2.逻辑思维训练500题 3.逻辑思维训练题目及答案 4.宝宝逻辑思维训练

数据结构实验二_栈的基本操作

青岛理工大学课程实验报告

s->top=s->base; s->stacksize=stack_init_size; return 1; } int Push(sqstack *s,int e) { if(s->top-s->base>=s->stacksize) { s->base=(int *)realloc(s->base,(s->stacksize+stackincrement)*sizeof(int)); if(!s->base) return 0; s->top=s->base+s->stacksize; s->stacksize+=stackincrement; } *(s->top++)=e; return e; } int Pop(sqstack *s,int e) { if(s->top==s->base) return 0; e=*--s->top; return e; } int stackempty(sqstack *s) { if(s->top==s->base) { return 1; } else Push(s,n%flag); n=n/flag; } while(!stackempty(s)) { e=Pop(s,e); switch(e) { case 10: printf("A"); break; case 11: printf("B"); break; case 12: printf("C"); break; case 13: printf("D"); break; case 14: printf("E"); break; case 15: printf("F"); break; default: printf("%d",e); } } printf("\n"); return 0; } int main() { sqstack s; StackInit(&s); conversion(&s); return 0; }

C语言数据结构串的基本操作

实验九串的基本操作 #include #include #include typedef char Status; int strlen(char *p) { int i=0; while(*p++)i++; return i; } typedef struct { char *ch; // 若是非空串,则按串长分配存储区,否则ch为NULL int length; // 串长度 }HString; // 初始化(产生空串)字符串T void InitString(HString *T) { (*T).length=0; (*T).ch=NULL; } // 生成一个其值等于串常量chars的串T Status StrAssign(HString *T, char *chars) { int i,j; if((*T).ch) free((*T).ch); // 释放T原有空间 i = strlen(chars); // 求chars 的长度i if(!i) { // chars的长度为0 (*T).ch = NULL; (*T).length = 0; } else { // chars的长度不为0 (*T).ch = (char*)malloc(i*sizeof(char)); // 分配串空间 if(!(*T).ch) // 分配串空间失败 exit(0); for(j = 0; j < i; j++) // 拷贝串 (*T).ch[j] = chars[j]; (*T).length = i; } return 1; } // 由串S复制得串T int StrCopy(HString *T,HString S) { int i; if((*T).ch) free((*T).ch); // 释放T原有空间 (*T).ch=(char*)malloc(S.lengt h*sizeof(char)); // 分配串空间if(!(*T).ch) // 分配串空间失 败 exit(0); for(i=0;i

看眼睛是如何欺骗大脑的(新)

什么叫视错觉? 视错觉就是当人或动物观察物体时,基于经验主义或不当的参照形成的错误的判断和感知。我们日常生活中,所遇到的视错觉的例子有很多: 上图A与B是同样大小的,下图中间的圆圈也是同样大的,但看到的却是一大一小,这是不真的事实。 比如法国国旗红:白:兰三色的比例为35:33:37,而我们却感觉三种颜色面积相等。这是因为白色给人以扩张的感觉,而兰色则有收缩的感觉。再比如把两个有盖的桶装上沙子,一个小桶装满了沙,另一个大桶装的沙和小桶的一样多。当人们不知道里面的沙子有多少时,大多数人拎起两个桶时都会说小桶重得多。他们之所以判断错误,是看见小桶较小,想来该轻一些,谁知一拎起来竟那么重,于是过高估计了它的重量。这就是视错觉。

视觉的形成 图为人的视觉成像经过。当外界物体反射来的光线带着物体表面的信息经过角膜、房水,由瞳孔进入眼球内部,经聚焦在视网膜上形成物象(图一)。物象刺激了视网膜上的感光细胞,这些感光细胞产生的神经冲动,沿着视神经传入到大脑皮层的视觉中枢,即大脑皮层的枕叶部位,在这里把神经冲动转换成大脑中认识的景象(图二)。这些景象的生成已经经过了加工,是“角度感”、“形象感”、“立体感”等协同工作,并把图像根据摄入的信息在大脑虚拟空间中还原,还原等于把图像往外又投了出去(图三)。虚拟位置能大致与原实物位置对准,这才是我们所见到的景物(图四)。 当我们看某个物体时,大脑究竟是如何工作的呢? 尽管我们现有的关于视觉系统的知识量很庞大,已经有了视觉心理学、视觉生理学和视觉分子及细胞生物学等学科,但对如何看东西我们确实还没有清楚的想法,对视觉过程仍然缺乏清晰、科学的了解。 你可能对自己如何看东西有了一个粗略的想法。比如认为每只眼睛就像一部微型电视摄像机,把外界景象聚焦到眼后一个特殊的视网膜屏幕上,每个视网膜有无数的光感受器,对

顺序栈的基本操作讲解

遼穿紳範大學上机实验报告 学院:计算机与信息技术学院 专 业 : 计算机科学与技术(师 范) 课程名称:数据结构 实验题目:顺序栈的基本操作 班级序号:师范1班 学号:201421012731 学生姓名:邓雪 指导教师:杨红颖 完成时间:2015年12月25号 一、实验目的: 1 ?熟悉掌握栈的定义、结构及性质; 2. 能够实现创建一个顺序栈,熟练实现入栈、出栈等栈的基本操作; 3?了解和掌握栈的应用。 二、实验环境: Microsoft Visual C++ 6.0

三、实验内容及要求: 栈是一种特殊的线性表,逻辑结构和线性表相同,只是其运算规则有更多的限制,故又称为受限的线性表。 建立顺序栈,实现如下功能: 1. 建立一个顺序栈 2. 输出栈 3. 进栈 4. 退栈 5. 取栈顶元素 6. 清空栈 7. 判断栈是否为空 进行栈的基本操作时要注意栈”后进先出”的特性。 四、概要设计: 1、通过循环,由键盘输入一串数据。创建并初始化一个顺序栈。 2、编写实现相关功能函数,完成子函数模块如下。 3、调用子函数,实现菜单调用功能,完成顺序表的相关操作

五、代码: #include #include #define maxsize 64 typedef int datatype; //定义结构体typedef struct { datatype data[maxsize]; int top; }seqstack; //建立顺序栈seqstack *SET(seqstack *s) { int i; s=(seqstack*)malloc(sizeof(seqstack)); s->top=-1; printf(" 请输入顺序栈元素(整型,以scanf("%d",&i); do{ s->top++; s->data[s->top]=i; scanf("%d",&i); 0 结束):"); }while(i!=0); printf(" 顺序栈建立成功\n"); return s; } //清空栈void SETNULL(seqstack *s) { s->top=-1;} //判断栈空 int EMPTY(seqstack *s) { if(s->top>=0) return 0; else return 1;} //进栈 seqstack *PUSH(seqstack *s) { int x; printf(" 你想要插入的数字:"); scanf("%d",&x); if(s->top==maxsize-1) { printf("overflow"); return NULL; } else {

数据结构实验四字符串的应用

第四章字符串的应用 【实验目的】 1. 熟练掌握字符串的数据类型定义以及字符串的五种基本操作的定义,并能利用这些基本操作实现字符串的其他基本操作的方法。 2. 熟练掌握字符串串的定长顺序存储结构上实现字符串的各种操作的方法。 3. 理解字符串的堆分配存储表示以及在其上实现字符串操作的基本方法。 4. 熟练掌握串的基本操作类型的实现方法,其中文本模式匹配方法是一个难点,在掌握了BF算法的基础上理解改进的KMP算法。 5. 了解一般文字处理软件的设计方法。 第一节知识准备 一、有关串几个重要概念 1. 串(字符串):零个或多个字符组成的有限序列。一般记作s="a1a2 …an"(n≥0) 2. 长度:串中字符的数目 3. 空串:零个字符的串,其长度为零 4. 子串和主串:串中任意个连续的字符组成的子序列称为该串的子串;包含子串的串相应地称为主串,字符在序列中的序号为该字符在串中的位置。 5. 当两个串的长度相等,并且各个对应位置的字符都相等时称为两串相等。 6. 空格串:由一个或多个空格组成的串‘’,同空串是完全不同的。 二、串的抽象数据类型定义 ADT String{ 数据对象:D={ | ∈C haracterSet, i=1,2,...,n, n>=0} 数据关系:R1={< , >| , ∈D, i=2,...,n} 基本操作: Assign(&s,t) 将串t的值赋给串 s Create(&s,ss) 将串s的值设定为字符序列ss Equal(s,t) 判定串s和串t是否相等 Length(s) 求串s的长度 Concat(&s,t) 将串s和串t连接成一个串,结果存于s中

超声百科全前脑畸形

超声百科--—---全前脑畸形 全前脑畸形(Holoprosencephaly) ,又称前脑无裂畸形:前脑不能正常分裂形成两侧大脑半球,导致侧脑室与第三脑 室融合,颜面与脑组织结构与功能缺陷。发病率约为胚胎中1:250,出生婴儿1:5000-10000、性别比:男:女=1:3(无分叶型);男:女=1:1(分叶型) 、全前脑畸形由多因素遗传,复发率6%。常染色体显性与常染色体隐性遗传。常合并染色体异常与多种综合征。(胎儿影像网-Fetalecho整理YuanShen 编译) 全前脑【胎儿畸形产前超声诊断学-李胜利】病因病理 前脑得发生 前脑包括间脑与端脑。原始前脑在胎儿第4~8周经过分裂与憩室化,形成端脑、前脑并分化出脑室系统、在胎龄25~30天时,前脑从神经管头端伸出。开始时仅为起自前神经孔背唇中线上得一个囊泡。这一囊泡为第三脑室与室间孔得原基。间脑与端脑得嗅叶将在其周围发生、在胎龄30~40天时,中线囊泡发生分裂并向外形成袋状,构成两侧脑泡。后发育成侧脑室被边缘叶所包绕得那一部分。最后,在第80~90天,侧脑泡进一步发生精细改变而形成复杂得管状结构,就是未 来得边缘上叶得核心。因此,前脑形成得主要时期就是胎龄第2、3个月。若在这一时期,发生障碍即引起一组复杂得颅脑与面部畸形称为前脑病。全前脑发生【胎儿畸形产前超声

诊断-徐佩莲】 定义与命名 全面脑畸形就是指在胚胎4~8周时,原始前脑分化发育过程中发生障碍,使前脑大部分没有分开。而出现终脑与间脑得高度形成不全、1882年,Kundrat最早对这类畸形以无嗅脑畸形加以记载,指出典型得无嗅脑畸形满足以下3个条件:①面部中线性畸形,如唇、腭裂畸形;②嗅球、嗅束缺如;③单脑室、后来人们改称为’全端脑畸形’与'全前脑畸形’,以更确切地表示畸形得特点。1959年Yakovlev提倡以’全前脑畸形’称之此种畸形,1963年DeMyer与Zeman将之正式命名为’全前脑畸形'、病因及联合畸形 致畸原:酒精;苯妥英;维生素A过量;糖尿病饮食;先天感染;放射源暴露。 胚胎学:发育早期前脑分裂缺如。 联合畸形:先心(特别就是右室双出口);脐膨 出;Dandy—Walker复合体;四肢发育畸形;小头畸形;巨头畸形;单脐动脉。 联合综合征:Shprintzen综合征, 先天性缺指(趾)畸形-外胚层发育不良面裂综合征(ectrodactyly—ectodermal dysplasia— clefting );70%以上染色体异常:13三体,18三体,三倍体,各种结构异常7q缺失。病理表现 全前脑畸形病理特点为侧脑室分离不全而呈单脑室,无大

数据结构栈的定义及基本操作介绍

北京理工大学珠海学院实验报告 ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY 班级软件工程3班学号 150202102309姓名郭荣栋 指导教师余俊杰成绩 实验题目栈的实现与应用实验时间 一、实验目的、意义 (1)理解栈的特点,掌握栈的定义和基本操作。 (2)掌握进栈、出栈、清空栈运算的实现方法。 (3)熟练掌握顺序栈的操作及应用。 二、实验内容及要求 1.定义顺序栈,完成栈的基本操作:建空栈、入栈、出栈、取栈顶元素(参见教材45页)。 2. 调用栈的基本操作,将输入的十进制数转换成十六进制数。 3. 调用栈的基本操作,实现表达式求值,如输入3*(7-2)#,得到结果15。 三、实验结果及分析 (所输入的数据及相应的运行结果,运行结果要有提示信息,运行结果采用截图方式给出。)

四、程序清单(包含注释) 1、2. #include #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 #define INCREASEMENT 10 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10

typedef int SElemType; typedef int Status; typedef struct{ SElemType *base; SElemType *top; int stacksize; }Sqstack; void StackTraverse(Sqstack S) { while (S.top != S.base) { cout << *(S.top-1) << endl; S.top--; } } Status InitStack(Sqstack &S){ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base){ exit(OVERFLOW); }

数据结构字符串复制,连接,求子串,KMP

数据结构字符串复制,连接,求子串,KMP #include #include #include #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INEEASLIBE -1 #define OVERFLOW -2 typedefint status; typedefstruct { char *ch; int length; }str; statusstringcopy(str&a,str b) { //free(a.ch); if(b.length==0) { a.ch='\0'; return OK; } if((a.ch=(char *)malloc(sizeof(char)*(b.length+1)))==NULL) return ERROR; inti=0; while(i

if(n<1||n>a.length) { printf("插入的位置不合法\n"); return ERROR; } str c; c.length=a.length+b.length; if((c.ch=(char*)malloc(sizeof(char)*(c.length+1)))==NULL) { return ERROR; } inti=0,j=0,l=0,k=0; while(i

数据结构《第4章 串存储与基本操作的实现》

第四章串存储与基本操作的实现 本章学习要点 ◆熟悉串的相关概念以及串与线性表的关系 ◆重点掌握串的定长存储、堆分配存储的表示方法与基本操作的实现 ◆了解串的各种存储结构,能根据需要合理选用串的存储结构解决实际问题 “串”(string),是字符串的简称,它是一种特殊的线性表,其特殊性在于组成线性表的数据元素是单个字符。字符串在计算机处理实际问题中使用非常广泛,比如人名、地名、商品名、设备名等均为字符串。同样在文字编辑、自然语言理解和翻译、源程序的编辑和修改等方面,都离不开对字符串的处理。 4.1串的基本概念 4.1.1串的概念 1.串的定义 串(string)是由n个字符组成的有限序列,记为:S=”a0a1a2…a n-1” (n≥0)。 其中,S是串的名字,字符序列a0a1a2…a n-1是串的值,a i(0≤i≤n-1)可以是字母、数字或其他字符元素;由于在C语言系统中数组元素的下标是从0开始的,所以串中所含元素的序号等于该元素的下标值加1;串中所含字符的个数n称为该串的长度,长度为0的字符串称为空串(null string)。 从串的定义可以看出,串实际上是数据元素为字符的特殊的线性表。 例如: (1)A=“X123” (长度为4的串) (2)B=“12345654321” (长度为11的串) (3)C=“Bei Jing” (长度为8的串) (4)D=“” (长度为0的空串) (5)E=“This is a string” (长度为16的串) (6)F=“ is a ” (长度为6的串) 2.子串、主串和位置 串中任意连续的字符组成的子序列称为该串的子串;相应地,包含子串的串称为主串。串中的字符在串序列中的序号称为该字符在该串中的位置;子串的第一个字符在主串中的位置称为子串在主串中的位置。显然,串为其自身的子串,并规定空串为任何串的子串。显然,在不考虑空子串的情况下,一个长度为n的字符串具有n(n+1)/2个子串。 例如: 在上例的(6)中串F就是(5)中串E的子串,且子串F在主串E中的位置是5。由于空格符也是一个字符,所以在串G=“abc defghne”中包含有子串“c def”,而串“cdef”不是串G的子串。串G中第一个字符…e?的位置是6,第二个字符…e?的位置是11。 3.串的比较 如果两个串的长度相等且对应位置上的字符相同,则称这两个串相等。两个串A、B的比较过程是:从前往后逐个比较对应位置上的字符的ASCII码值,直到不相等或有一个字符串结束为止,此时的情况有以下几种: (1)两个串同时结束,表示A等于B; (2)A中字符的ASCII码值大于B中相应位置上字符的ASCII码值或B串结束,表示A大于B;(3)B中字符的ASCII码值大于A中相应位置上字符的ASCII码值或A串结束,表示A小于B。

数据结构栈的基本操作,进栈,出栈

第五次实验报告—— 顺序栈、链栈的插入和删除一需求分析 1、在演示程序中,出现的元素以数字出现定义为int型, 2、演示程序在计算机终端上,用户在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在终端上 3、顺序栈的程序执行的命令包括如下: (1)定义结构体 (2)顺序栈的初始化及创建 (3)元素的插入 (4)元素的删除 (5)顺序栈的打印结果 3、链栈的程序执行的命令包括如下: (1)定义结构体 (2)链栈的初始化及创建 (3)元素的插入 (4)元素的删除 (5)链栈的打印结果 二概要设计 1、顺序栈可能需要用到有序表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0} 数据关系:R1={|ai-1,ai ∈D, i=2,...,n } 基本操作: InitStack(SqStack &S) 操作结果:构造一个空栈 Push(L,e) 操作结果:插入元素e为新的栈顶元素

Status Pop(SqStack &S) 操作结果:删除栈顶元素 }ADT List; 2、链栈可能需要用到有序表的抽象数据类型定义: ADT List{ 数据对象:D={ai|ai∈ElemL, i=1,2,...,n, n≥0} 数据关系:R1={|ai-1,ai ∈D, i=2,...,n } 基本操作: LinkStack(SqStack &S) 操作结果:构造一个空栈 Status Push(L,e) 操作结果:插入元素e为新的栈顶元素 Status Pop(SqStack &S) 操作结果:删除栈顶元素 }ADT List; 3、顺序栈程序包含的主要模块: (1) 已给定的函数库: (2)顺序栈结构体: (3)顺序栈初始化及创建: (4)元素插入 (5)元素删除

数据结构实验报告3--链串

宁波工程学院电信学院计算机教研室 实验报告 课程名称:___ 数据结构 ___ __ 实验项目:链串的基本算法 指导教师: 实验位置:电子楼二楼机房姓名: 学号: 班级:计科102 日期: 2011/10/13 一、实验目的 1)熟悉串的定义和串的基本操作。 2)掌握链串的基本运算。 3)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。 二、实验环境 装有Visual C++6.0的计算机。 三、实验内容 编写一个程序,实现链串的各种基本运算,并在此基础上设计一个主程序。具体如下: 编写栈的基本操作函数 链串类型定义如下所示: typedef struct snode{ char data; struct snode *next; }listring; (1)串赋值Assign(s,t) 将一个字符串常量赋给串s,即生成一个其值等于t的串s (2)串复制StrCopy(s,t)

?将串t赋给串s (3)计算串长度StrLength(s) ?返回串s中字符个数 (4)判断串相等StrEqual(s,t) ?若两个串s与t相等则返回1;否则返回0。 (5)串连接Concat(s,t) ?返回由两个串s和t连接在一起形成的新串。 (6)求子串SubStr(s,i,j) ?返回串s中从第i(1≤i≤StrLength(s))个字符开始的、由连续j 个字符组成的子串。 (7)插入InsStr (s,i,t) ?将串t插入到串s的第i(1≤i≤StrLength(s)+1)个字符中,即将t 的第一个字符作为s的第i个字符,并返回产生的新串(8)串删除DelStr (s,i,j) ?从串s中删去从第i(1≤i≤StrLength(s))个字符开始的长度为j 的子串,并返回产生的新串。 (9)串替换RepStr (s,s1,s2) ?在串s中,将所有出现的子串s1均替换成s2。 (10)输出串DispStr(s) ?输出串s的所有元素值 (11)判断串是否为空IsEmpty(s) 编写主函数 调用上述函数实现下列操作: (1)建立串s=“abcdefghijklmn”,串s1=“xyz”,串t=“hijk” (2)复制串t到t1,并输出t1的长度 (3)在串s的第9个字符位置插入串s1而产生串s2,并输出s2 (4)删除s第2个字符开始的5个字符而产生串s3,并输出s3 (5)将串s第2个字符开始的3个字符替换成串s1而产生串s4,并输出s4 (6)提取串s的第8个字符开始的4个字符而产生串s5,并输出s5 (7)将串s1和串t连接起来而产生串s6,并输出s6 (8)比较串s1和s5是否相等,输出结果 程序清单: #include

数据结构——顺序栈的基本操作

#include using namespace std; # define STACK_INIT_SIZE 100 # define STACKINCREMENT 10 typedef struct { int * base; int * top; int stacksize;//当前栈可使用的最大容量 } SqStack; void InitStack(SqStack &S)//构造一个空栈 { S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!S.base) {cout<<"存储分配失败!!!"<=S.stacksize) { S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int)); if(!S.base) cout<<"存储分配失败!!!"<

(完整word版)顺序栈基本操作实验报告

数据结构实验三 课程数据结构实验名称顺序栈基本操作第页 专业班级学号 姓名 实验日期:年月日评分 一、实验目的 1.熟悉并能实现栈的定义和基本操作。 2.了解和掌握栈的应用。 二、实验要求 1.进行栈的基本操作时要注意栈"后进先出"的特性。 2.编写完整程序完成下面的实验内容并上机运行。 3.整理并上交实验报告。 三、实验内容 1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。 2.编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。 主要功能描述如下: (1)从键盘上输入表达式。 (2)分析该表达式是否合法: ?a) 是数字,则判断该数字的合法性。若合法,则压入数据到堆栈中。 ?b) 是规定的运算符,则根据规则进行处理。在处理过程中,将计算该表达式的值。 ?c) 若是其它字符,则返回错误信息。 (3)若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。 程序中应主要包含下面几个功能函数: ?l void initstack():初始化堆栈 ?l int Make_str():语法检查并计算

?l int push_operate(int operate):将操作码压入堆栈 ?l int push_num(double num):将操作数压入堆栈 ?l int procede(int operate):处理操作码 ?l int change_opnd(int operate):将字符型操作码转换成优先级 ?l int push_opnd(int operate):将操作码压入堆栈 ?l int pop_opnd():将操作码弹出堆栈 ?l int caculate(int cur_opnd):简单计算+,-,*,/ ?l double pop_num():弹出操作数 四、实验步骤 (描述实验步骤及中间的结果或现象。在实验中做了什么事情,怎么做的,发生的现象和中间结果) 第一题: #include using namespace std; #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 #define OVERFLOW -1 #define OK 1 #define NO -1 #define NULL 0 typedef int Status; typedef char SElemType; typedef struct { SElemType *base; //在栈构造之前和销毁之后,base的值为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 } SqStack; Status Initstack(SqStack &S)//构造一个空栈S { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); S.top=S.base; S.stacksize= STACK_INIT_SIZE; return OK; }//InitStack Status StackEmpty(SqStack &S) { if(S.base==S.top)

数据结构栈的基本操作

#include #include typedef struct{ int *base; int *top; int stacksize; }Sqstack;//定义栈 int IntSqstack(Sqstack &s) {s.base=(int*)malloc(1*sizeof(int)); if(!s.base)exit(0); s.top=s.base; s.stacksize=1; return 0; }//初始化栈 void Push(Sqstack &s,int e) { if(s.top-s.base>=s.stacksize){ s.base=(int*)realloc(s.base,(s.stacksize+1)*sizeof(int)); if(!s.base)exit(-1); s.top=s.base+s.stacksize; s.stacksize++; } *s.top++=e; }//进栈函数 void Pop(Sqstack &s,int e) {int *q,i; q=s.top,i=s.stacksize; while(i!=0&&*q!=e) {q--; i--; } for(;q!=s.top;q++)*q=*(q+1); s.stacksize--; }//出栈函数

int OutputStack(Sqstack s) { while(s.stacksize!=0) { printf("%d ",*s.base); s.base++; s.stacksize--; } return 0; }//输出栈元素 void main() { Sqstack L; int i,j,k; IntSqstack(L); printf("输入你要的栈的大小\n"); scanf("%d",&j); for(k=01;k<=j;k++) { printf("请输入第%d个栈元素\n",k); scanf("%d",&i); Push(L,i); } OutputStack(L); printf("栈顶元素是%d",*--L.top); printf("输入你要删除的元素\n"); scanf("%d",&j); Pop(L,j); OutputStack(L); }

数据结构(C语言)栈的基本操作

实验名称栈的基本操作 实验目的 掌握栈这种抽象数据类型的特点及实现方法。 实验内容 从键盘读入若干个整数,建一个顺序栈或链式栈,并完成下列操作: (1)初始化栈; (2)判栈为空; (3)出栈; (4)入栈。 算法设计分析 (一)数据结构的定义 struct stackNode{ int data; struct stackNode *nextPtr; }; typedef struct stackNode listStact; typedef listStact *stackNodePtr; (二)总体设计 程序由主函数、入栈函数,出栈函数,删除函数判官是否为空函数和菜单函数组成。 (1)主函数:调用各个函数以实现相应功能

(三)各函数的详细设计: Function1: void instruct() //菜单 (1):使用菜单显示要进行的函数功能; Function2:void printStack(stackNodePtr sPtr) //输出栈 (1):利用if判断栈是否为空; (2):在else内套用while(头指针不为空条件循环)循环输出栈元素; Function3:void push(stackNodePtr *topPtr,int value //进栈 (1):建新的头指针; (2):申请空间; (3):利用if判断newPtr不为空时循环进栈 (4):把输入的value赋值给newPtr,在赋值给topPtr,再指向下一个位置; Function4:int pop(stackNodePtr*topPtr) //删除 (1):建新的头指针newPtr; (2):利用if判断newPtr是否为空,再删除元素。 (3):把topPtr等于newPtr,把头指针指向的数据赋值给topValue,输出要删除的数据值,头指针指向下一个位置,并清空newPtr; (4):完成上述步骤后,return toPvalue,返回;

数据结构--06字符串的基本操作

《数据结构》实验报告 院系光电与信息工程学院专业电子信息工程 姓名学号电话 2011级2班2013年4月22日 1.实验题目 实验6. 字符串的基本操作 2.需求分析 (1)字符串匹配。 采用顺序结构存储串,编写一个函数SubStr(str1,str2),用于判定str2是否是str1的子串。 (2)公共字符串。 问题描述编写一个函数,实现在两个已知字符串中找出所有非空最长公共子串的长度和最长公共子串的个数。 实现要求输出非空最长公共子串的长度和最长公共子串的个数。 字符串匹配: ①串长度Strlen(SString str) ②判断是否为子串SubStr(SString str1,SString str2) 公共字符串: ①串长度Strlen(SString str) ②最大公共串长度函数maxlen() ③求公共串个数函数SubStrnum() 输入形式:字符串。 3.概要设计 (1) ADT SString{ 数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0} 结构关系:R={|a i,a i+1 ∈D} 基本操作: Strlen(SString str) 操作前提:字符串str已存在 操作结果:求str的长度 SubStr(SString str1,SString str2) 操作前提:字符串str已存在 操作结果:判断str2是不是str1的子串 } ADT SString{ 数据对象:D={a i|a i∈IntegerSet,i=0,1,2,…,n,n≥0}

基本操作: Strlen(SString str) 操作前提:字符串str已存在 操作结果:求str的长度 maxlen(SString str1,SString str2,SString str) 操作前提:字符串str1,str2,str已存在 操作结果:求str1和str2的最大公共子串长度,并将该子串赋给str SubStrnum(SString str1,SString str2) 操作前提:字符串str1,str2已存在 操作结果:求在str1中str2子串的个数 } (2)字符串匹配: 本程序包含3个函数: ?主函数main() ?求串长函数Strlen(SString str) ?{字符串匹配函数SubStr(SString str1,SString str2) 各函数调用关系:主函数main调用其他两个函数 公共字符串: 本程序包含4个函数: ?主函数main() ?求串长函数Strlen(SString str) ?最大公共串长度函数maxlen() ?求公共串个数函数SubStrnum() 各函数调用关系:主函数main调用其他三个函数 (3)字符串匹配: 主函数的伪码 main() { 定义SString 变量str1,str2; 输入第一个字符串; 输入第二个字符串; 调用字符串匹配函数; 输出匹配结果; } 公共字符串: 主函数的伪码

脑室镜20071209

神经内窥镜下侧脑室前角的应用解剖学研究 邹庆峰张继源 (大理市第一人民医院骨科,大理,云南,671000) 【摘要】目的了解神经内镜侧脑室的解剖特点和重要解剖标志及比较侧脑室额角不同入路的特点。方法查阅解剖学资料,对比、测量、研究10例成年国人尸头。选取眉弓上2.5厘米、中线旁开2.0厘米;冠状缝前2.5厘米、中线旁开2.5厘米;冠状缝前1.0厘米、中线旁开1.0厘米六个点分别进行穿刺,对比分析各解剖入路的优劣。结果(1) A点有两例与大脑上静脉枕静脉支毗邻,C点在5例标本上与正中矢状窦毗邻9毫米,B点均避开大脑动静脉,重要的神经中枢(2)额角入路暴露范围, 前至额角, 后至枕角, 下至三脑室及导水管。(3)从A、B、C三点穿刺,0线的厚度分别为41.00±7.15mm、46.50±8.58mm、50.80±10.13mm;α角分别为16.10°±11.77°、82.90°±2.77°、77.00°±12.44°;β角8.70°±5.14°、9.80°±3.52°、4.40°±1.78°。结论(1) 侧脑室形态固定, 解剖标志明确, 应用神经内窥镜可使脑室内的部分病变在直视下切除, 并且创伤较小; (2) 大多数病变采用额角入路可用为补充。(3)B点是额角神经内镜的比较理想的入路。 【关键词】神经内镜解剖侧脑室 资料与方法: 1、研究对象:对10%甲醛溶液固定的完整成人尸头5具(10 侧)进 观察。颅骨钻孔穿刺脑室后, 观察脑室内结构。 2、器械及设备:游标卡尺,常规解剖开颅器械(电钻、刀锯、解剖凿、解剖刀等)。 3、研究方法:在尸头上分别模拟神经内窥镜手术,穿刺定位。穿刺经

数据结构 栈和队列的基本操作实现及其应用

实验二栈和队列的基本操作实现及其应用 一、实验目的 1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。 2、会用栈和队列解决简单的实际问题。 二、实验内容(可任选或全做) 题目一、试写一个算法,判断依次读入的一个以@为结束符的字符序列, 是否为回文。所谓“回文“是指正向读和反向读都一样的一字符串,如“321123”或“ableelba”。 相关常量及结构定义: # define STACK_INIT_SIZE 100 # define STACKINCREMENT 10 # define OK 1 # define ERROR 0 typedef int SElemType; //栈类型定义 typedef struct SqStack { SElemType *base; SElemType *top; int stacksize; }SqStack; 设计相关函数声明: 判断函数:int IsReverse() 栈:int InitStack(SqStack &S ) int Push(SqStack &S, SElemType e ) int Pop(SqStack &S,SElemType &e) int StackEmpty(s) 题目二、编程模拟队列的管理,主要包括: 出队列、 入队、 统计队列的长度、 查找队列某个元素e、 及输出队列中元素。 [实现提示]:参考教材循环队列的有关算法,其中后两个算法参考顺序表的实现。 题目三、Rails

Description There is a famous railway station in PopPush City. Country there is incredibly hilly. The station was built in last century. Unfortunately, funds were extremely limited that time. It was possible to establish only a surface track. Moreover, it turned out that the station could be only a dead-end one (see picture) and due to lack of available space it could have only one track. The local tradition is that every train arriving from the direction A continues in the direction B with coaches reorganized in some way. Assume that the train arriving from the direction A has N <= 1000 coaches numbered in increasing order 1, 2, ..., N. The chief for train reorganizations must know whether it is possible to marshal coaches continuing in the direction B so that their order will be a1, a2, ..., aN. Help him and write a program that decides whether it is possible to get the required order of coaches. You can assume that single coaches can be disconnected from the train before they enter the station and that they can move themselves until they are on the track in the direction B. You can also suppose that at any time there can be located as many coaches as necessary in the station. But once a coach has entered the station it cannot return to the track in the direction A and also once it has left the station in the direction B it cannot return back to the station. Input The input consists of blocks of lines. Each block except the last describes one train and possibly more requirements for its reorganization. In the first line of the block there is the integer N described above. In each of the next lines of the block there is a permutation of 1, 2, ..., N. The last line of the block contains just 0. The last block consists of just one line containing 0. Output

相关文档
最新文档