数据结构课程设计回文数问题
数据结构回文实验报告
数据结构回文实验报告1. 实验目的本实验旨在通过使用数据结构中的栈和队列的知识,设计并实现一个回文判断程序,以检测给定的字符串是否为回文。
2. 实验原理回文是指正读和反读都相同的字符串。
在本实验中,我们将使用栈和队列来判断给定字符串是否为回文。
具体步骤如下:2.1 将字符串加入栈和队列将给定的字符串依次加入栈和队列中,保持顺序一致。
2.2 从栈和队列中弹出字符从栈和队列中分别弹出字符,并进行比较。
2.3 判断是否为回文如果所有字符都一一相等,那么该字符串就是回文。
否则,不是回文。
3. 实验步骤接下来,我们将按照上述原理,逐步进行回文判断的实验。
3.1 导入所需库由于本实验仅使用了基本的数据结构,无需导入额外的库或模块。
3.2 创建栈和队列首先,我们需要创建栈和队列的数据结构。
栈可以通过使用列表来实现,而队列则可以通过使用双端队列来实现。
# 创建栈stack = []# 创建队列from collections import dequequeue = deque()3.3 输入字符串接下来,我们需要从用户获取一个待判断的字符串。
# 获取待判断的字符串string = input("请输入待判断的字符串:")3.4 将字符串加入栈和队列将输入的字符串依次加入栈和队列中。
# 将字符串加入栈和队列for char in string:stack.append(char)queue.append(char)3.5 从栈和队列中弹出字符并比较从栈和队列中分别弹出字符,并进行比较,直到栈或队列为空。
is_palindrome =Truewhile len(stack) >0and len(queue) >0:stack_char = stack.pop()queue_char = queue.popleft()if stack_char != queue_char:is_palindrome =Falsebreak3.6 输出判断结果根据比较结果,输出判断字符串是否为回文。
数据结构课程实验报告(回文篇)
数据结构课程实验报告要求实验题目:回文判断算法班级通信143姓名刘海波学号2014101114日期2015.6.17一、需求分析1.程序的功能;利用栈和队列的操作来实现对字符序列是否是一个回文序列的判断。
设计和验证入栈、出栈及入队、出队的算法。
2.输入输出的要求;从键盘读入一组字符序列,按输入顺序入队列到链式队列A中。
并将创建好的A队列中元素依次遍历,打印在屏幕上。
将字符序列从A队列出队列,压入到一个顺序栈中。
再将字符序列从顺序栈中出栈,入队到另一个链式队列B中。
将创建好的B队列中元素依次遍历,打印在屏幕上。
将A,B队列中的元素出队逐一比较,判断是否一致。
若一致则是回文,并将判定结果打印到屏幕上。
3.测试数据:输入一组字符串进行判断。
二、概要设计1.本程序所用的抽象数据类型的定义;typedef struct{char item[STACKSIZE];int top;}SqStack;typedef struct QNode{char data;struct QNode *next;}LQNode, *PQNode;typedef struct{PQNode front,rear;} LinkQueue;2.主程序的流程及各程序模块之间的层次关系。
从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为*停止插入。
在程序中设置了一个标志位flag,将输入的序列分别做入栈、出栈、入队、出队操作,若出栈与出队的数据完全一致,则将flag标志为1,否则为零。
Flag 为1,则表示该序列是回文序列,否则,为非回文序列。
三、详细设计1.采用c语言定义相关的数据类型;typedef struct{char item[STACKSIZE];int top;}SqStack;typedef struct QNode{char data;struct QNode *next;}LQNode, *PQNode;typedef struct{PQNode front,rear;} LinkQueue;2.写出各模块的伪码算法;int InitStack(SqStack *S)int StackEmpty(SqStack S)int Push(SqStack *s, char data)int Pop(SqStack *s, char *data)int InitQueue(LinkQueue *q)int QueueEmpty(LinkQueue q)int EnQueue(LinkQueue *q, char item)int DeQueue(LinkQueue *q, char *item)int PutOutQueue(LinkQueue q)四、调试分析1.调试中遇到的问题及对问题的解决方法;对于语句中的一般回文单词能正常输出,句末跟标点符号连在一起的回文单词也能通过程序把字符串末尾的标点给去掉并正常输出,而字符串中的连接符可以作为回文单词的组成部分一起输出。
最小回文问题课程设计心得体会
课程设计的心得体会
Xxx班xxxx
经过为期一个多星期的课程设计,对回文这个概念有了一个更深的认识,同时,在整个课程设计的过程中,使我更深切的体会到了算法思想对于一个问题的重要性。
在这段时间里,我用了很大一部分的时间来考虑算法,考虑用怎样的方法来实现最小回文数的计算,只用了一小部分的时间来把我的思想用程序写出来。
当然,在调试的过程中也出现了许许多多的错误,但都被调试成功,并最终完成了该问题的要求。
在这次课程设计中,我学会了一个解决问题的方法,那就是从整体出发,一层一层往里深入。
比如求最小回文数,只要求用原字符串减去原字符串与逆序字符串的最大公共序列长度即可。
而该问题的关键接着就是如何求出原字符串与逆序字符串的最大公共序列长度。
对于这个问题,我从拿到题目就开始思考,一直思考了很久都没有找到一个很好的方法,有的是只对一部分字符串适用,有的是不可用程序实现,经过不断的摸索和查阅资料,最后终于找到了一个正确的求原字符串与逆序字符串的最大公共序列长度算法。
从而完成了程序设计。
这次课程设计虽然没有用到数据结构与算法一书里的相关数据结构,但是其算法思想还是离不开这本书的,因为老师在给我们上课时着重强调算法思想的重要性,所以我从算法思想出发,完成了该程序的任务要求,但并不否认,c语言基础也是非常重要的,因为光有算法思想,不能用c语言进行表达,不能使其运行,就等于是做无用功。
在课程设计过程中,我复习了数组的相关使用方法,加深了对for循环语句的理解和while循环语句的使用。
通过这次课程设计,我知道了自己在逻辑思维上还不够敏锐,不能很好的理清思路;在c语言基础知识上还有待加强,在以后的学习中,我会不断努力,不断提升自己这一方面的能力。
最小回文问题实验报告
Xx学院计算机科学与技术系课程设计报告2010~2011学年第2 学期课程数据结构与算法课程设计题目名称最小回文代价问题学生姓名XXXX学号XXXXXXXX专业班级XXXX班指导教师XXX、XXX2011年6月1、题目最小回文代价问题:回文是指一个对称的字符串,代表这个串从左往右读和从右往左读是一样的。
给定一个字符串,往其中插入最少的字符,得到一个回文串,求最小插入字符数。
2、问题分析(一)本程序要求实现给定一个字符串,往其中插入最少的字符,得到一个回文串,求最小插入字符数。
首先需要明确算法思想,根据提示知道,算法思想是用原字符串的长度减去原字符串和逆序字符串的公共序列长度,所以本程序关键要实现:(1)输入一给定字的符串;(2)求该字符串的逆序;(3)求原字符串和逆序字符串的最大公共序列长度;(4)求原字符串的长度减去最大公共序列长度,即为最少插入字符数(二)数据的输入形式和输入值的范围:首先输入一个字符串,然后输入选择键:1表示继续输入字符串,0表示结束该程序。
(1)结果的输出形式:如果该字符串是回文,则输出该字符串是回文,最少需要插入字符0;如果该字符串不是回文,则输出该字符串不是回文并输出最少需要插入的字符数。
(2)测试数据:(a)输入的字符串为:a b a c d b a c(b)输入的字符串为:a b c d d c b a(c)输入的字符串为:a b c d e f g h i j k3、数据结构的选择和概要设计(1)该程序的数据结构为一个存放原字符串的数组s,一个存放逆序字符串的数组daoxu和一个用于存放公共序列长度的二维数组LCS。
(2)为了实现上述程序的功能,需要:A,输入一给定的字符串B,求出该字符串的逆序C,求出原字符串和逆序字符串的最大公共序列长度D,求出原字符串的长度减去最大公共序列长度,即为最少插入字符数a,主函数main()b,字符串倒置函数:daozhi()c,计算最大公共序列长度函数:length()各函数间关系如右图1所示:图14、算法思想该程序的算法思,从整个算法来看,是先求出原字符串和逆序字符串的最大公共序列长度,用原字符串的长度减去原字符串和逆序字符串的最大公共序列长度。
数据结构回文实验报告
数据结构回文实验报告数据结构回文实验报告引言:数据结构是计算机科学中的重要概念,它研究如何组织和管理数据,以便高效地访问和操作。
回文是一种特殊的字符串,它正着读和倒着读都一样。
在本实验中,我们将探索使用不同的数据结构来判断一个字符串是否为回文。
实验目的:1. 了解回文的概念和特点;2. 掌握常见的数据结构,如数组、链表和栈;3. 实践使用不同数据结构来判断字符串是否为回文;4. 比较不同数据结构在回文判断中的性能差异。
实验过程:首先,我们需要定义一个字符串,并将其存储在不同的数据结构中。
我们选择了“level”这个回文字符串作为示例。
1. 数组:我们使用一个字符数组来存储字符串。
首先,我们需要计算字符串的长度,并将每个字符按顺序存储在数组中。
然后,我们使用两个指针,一个指向数组的开头,一个指向数组的末尾,逐个比较它们所指向的字符是否相同。
如果所有字符都相同,则该字符串是回文。
2. 链表:我们使用一个单向链表来存储字符串。
每个节点包含一个字符和一个指向下一个节点的指针。
我们将字符串的每个字符依次插入链表的末尾。
然后,我们使用两个指针,一个指向链表的开头,一个指向链表的末尾,逐个比较它们所指向的字符是否相同。
如果所有字符都相同,则该字符串是回文。
3. 栈:我们使用一个栈来存储字符串。
我们将字符串的每个字符依次入栈。
然后,我们使用两个指针,一个指向栈的顶部,一个指向栈的底部,逐个比较它们所指向的字符是否相同。
如果所有字符都相同,则该字符串是回文。
实验结果:我们对以上三种数据结构进行了回文判断实验,并记录了结果。
在本次实验中,我们发现使用数组和栈的方法可以正确判断字符串是否为回文,而使用链表的方法则无法正确判断。
这是因为链表无法像数组和栈一样快速访问和比较元素。
性能比较:我们进一步比较了使用数组和栈的方法在回文判断中的性能差异。
我们使用了不同长度的字符串进行实验,并记录了执行时间。
实验结果显示,数组的执行时间与字符串长度成正比,而栈的执行时间与字符串长度无关。
数据结构回文判断
数据结构回文判断在计算机科学和编程的世界里,数据结构是非常重要的一部分。
而回文判断作为一个常见的问题,在数据结构的应用中有着不少有趣的解法。
首先,咱们得搞清楚啥是回文。
简单来说,回文就是一个正着读和倒着读都一样的字符串或者序列。
比如“12321”“racecar”,不管你从前往后读,还是从后往前读,结果都是一样的。
那怎么判断一个字符串是不是回文呢?这就需要用到一些数据结构和算法的知识了。
一种常见的方法是使用数组。
我们可以把要判断的字符串的每个字符都存到一个数组里,然后从数组的两头开始比较。
一头从开头,一头从结尾,一个一个地比,如果对应的字符都一样,那就说明是回文;只要有一对不一样,那就不是回文。
举个例子,比如要判断“racecar”这个字符串是不是回文。
我们先把它的每个字符存到一个数组里:'r','a','c','e','c','a','r'。
然后从两头开始比较,先比较第一个字符'r'和最后一个字符'r',一样;再比较第二个字符'a'和倒数第二个字符'a',也一样;就这样一直比下去,发现都一样,所以“racecar”就是回文。
不过,使用数组来判断回文有一个小小的问题。
那就是如果字符串很长,需要的存储空间就会比较大。
这时候,我们可以考虑使用栈这种数据结构。
栈的特点是先进后出。
我们可以把字符串的前半部分字符依次压入栈中,然后再依次取出栈顶的字符和字符串后半部分的对应字符进行比较。
比如说对于字符串“12321”,我们先把“123”依次压入栈中,然后从字符串的第四个字符开始,和从栈中取出的字符比较。
先取出栈顶的 3 和第四个字符 2 比较,不一样,那就不是回文;如果都一样,那就是回文。
除了栈,队列也能派上用场。
我们可以把字符串的前半部分放入队列,后半部分按照相反的顺序放入另一个队列。
然后依次取出两个队列的队头元素进行比较,如果都一样,就是回文,否则就不是。
回文数的课课程设计
回文数的课课程设计一、教学目标本节课的教学目标是让学生掌握回文数的概念、性质和判断方法,能够运用回文数的性质解决相关问题。
知识目标包括:了解回文数的定义和性质,掌握回文数的判断方法,能够举出相关的例子。
技能目标包括:能够运用回文数的性质解决实际问题,如判断一个数是否为回文数,找出最长的回文数等。
情感态度价值观目标包括:培养学生的探究精神,提高学生对数学的兴趣,使学生能够感受到数学的美妙。
二、教学内容本节课的教学内容主要包括回文数的定义、性质和判断方法。
首先,介绍回文数的定义,让学生了解回文数的特点。
然后,引导学生探索回文数的性质,如回文数的位数、回文数的乘法等。
接着,教授回文数的判断方法,让学生能够熟练地判断一个数是否为回文数。
最后,通过一些实际问题,让学生运用回文数的性质解决问题。
三、教学方法为了达到本节课的教学目标,采用多种教学方法相结合的方式进行教学。
首先,采用讲授法,向学生介绍回文数的概念、性质和判断方法。
其次,采用讨论法,让学生分组讨论回文数的性质,引导学生进行思考。
然后,采用案例分析法,通过一些具体的例子,让学生理解和掌握回文数的性质。
最后,采用实验法,让学生进行实际的操作,找出最长的回文数。
四、教学资源为了支持本节课的教学内容和教学方法的实施,准备了一些教学资源。
教材是《数学课程标准》规定的人教版教材,其中包含了回文数的相关内容。
参考书选择了《数学奥林匹克》和《数学年鉴》,其中有一些关于回文数的深入研究和应用实例。
多媒体资料包括了一些关于回文数的视频和图片,能够丰富学生的学习体验。
实验设备包括计算机和网络,用于学生进行实际的操作和查询。
五、教学评估本节课的教学评估将采用多元化的评估方式,以全面、客观、公正地评价学生的学习成果。
评估方式包括平时表现、作业、考试等。
平时表现主要评估学生在课堂上的参与程度、提问回答等情况,以考察学生的学习态度和积极性。
作业评估主要评估学生的练习完成情况,包括回文数的判断练习和相关的思考题。
数据结构课程设计-回文判断
设计题目:3.4.4 回文判断专业:****:***学号:***日期:2011.09.11一,问题描述二,需求分析三,概要设计四,详细设计五,测试分析六,源程序清单七,用户使用手册八,心得体会1一、问题描述判断依次读入的一个以为结束符的字母序列,是否形如“序列1&序列2”模式的字符序列。
其中序列1和序列2都不含“&”字符,且序列2是序列1的逆序列。
二、需求分析(1)输入测试数据组数,接着分组输入字符串,以结尾。
(2)输入序列总长不超过(MAX_N = 10005)/2 个。
将序列1先入栈,接着处理序列2,同时出栈判断。
(3)将序列1全部入栈,接着输入序列2,同时出栈判断。
(4)如果序列满足题目要求,则输出“回文序列”;否则,输出“非回文序列”。
(5)测试数据:pal.txt12a+b&b+aa&ba&a2&&&&ab&baabc&bcbc&cba&abab&三、概要设计(1)数据结构:typedef struct Stack{int top,size;char str[MAX_N>>1];};使用结构体,部定义数组模拟栈。
top为栈顶指针,指向当前元素的下一个位置,size表示栈的元素个数。
(2)函数介绍:void st_init(Stack *st);//栈的初始化bool st_push(Stack *st,const char *temp);//入栈34bool st_top(Stack *st,char *temp); //出栈(3)程序流程图:5四、详细设计主要出栈和入栈函数,可以对边界进行处理,防止栈为空情况。
bool st_push(Stack *st,const char *temp){if( st->top>st->size )return false;st->str[st->top++] = *temp;return true;}bool st_pop(Stack *st){if( st->top==0 )return false;st->top--;return true;}另外还有取栈顶函数。
数据结构C语言版判断回文数实验报告
数据结构C语言版判断回文数实验报告实验目的:1. 了解回文数的定义和判断方法2. 掌握C语言中字符串的处理方法3. 学习如何使用栈来判断字符串是否为回文数实验原理:回文数是一个正整数,它的各位数字倒过来排列后仍然是同一个数。
比如121、12321就是回文数,而123、56789就不是回文数。
判断一个字符串是否为回文数,可以将字符串中的每一个字符逐个压入栈中,然后再依次将栈中的字符弹出,与原字符串中的字符逐个比较。
实验步骤:1. 定义一个栈结构体,其中包含一个整型数组和一个顶部指针变量。
顶部指针变量用于指向栈顶的位置。
```c#define MAXSIZE 100 // 定义栈中最大元素数量typedef struct {int data[MAXSIZE]; // 栈中元素数据int top; // 栈顶指针} Stack;```2. 定义一个函数用于判断字符串是否为回文数。
函数接收一个字符串指针作为参数。
首先计算字符串的长度,然后将字符串中的每一个字符压入栈中。
接着依次将栈中的字符弹出,与原字符串中的字符逐个比较。
如果两者不同,则说明该字符串不是回文数,函数返回0并退出。
如果所有字符都比较完成后没有发现不同,说明该字符串是回文数,函数返回1并退出。
// 将字符串中的每一个字符压入栈中for (int i = 0; i < len; i++) {s.data[++s.top] = str[i];}return 1;}```3. 在主函数中,首先要输入一个字符串,然后调用is_palindrome函数进行判断,最后输出判断结果。
实验结果:测试数据:输入:"12321"请输入一个字符串:12321该字符串是回文数"abcde""aabbabbaa"分析:实验结果验证了判断回文数的方法和字符串操作的正确性,同时掌握了使用栈来判断字符串是否为回文数的方法,有助于更好地理解栈的概念和应用。
求出500以内回文数微机原理课程设计说明书
目录摘要 (1)1.设计目的和要求 (2)1.1设计目的 (2)2.程序设计说明 (2)2.1 程序设计流程图 (3)2.2 程序段落说明 (4)2.2.1程序定义段 (4)2.2.3回文数判定程序设计 (5)2.2.4 程序结束程序段 (7)3.程序调试及结果 (7)小结及体会 (8)参考文献 (9)附录 (10)摘要日常生活中,计算机能处理的信息是多种多样的,如各种数据的查询与计算,不同的文字符号,各种图像信息。
利用计算机的逻辑性与它的告诉计算,我们可以解决许多趣味性的数学问题,用汇编语言程序能实现数的查找计算及显示,能在MF2KI中演示,编写一定功能的程序。
此次课程设计基于我们这学期所学的《微机原理与接口技术》,要求我们运用书上知识解决汇编语言编程问题,程序要求能将实现大小写字母转换,并且输入查找字符时,能显示该字符在字符串中的位置,若原字符串中没有该字符,则在屏幕上显示相应的提示语句。
程序能实现人机交互功能,有一定的提示语句。
汇编语言设计时先绘制流程图,分配存储空间,编写程序,对于我们熟悉汇编语言程序的编写,程序思路的设计有很大的帮助,应严肃认真对待。
关键词:汇编语言编程回文数的寻找求出500以内的回文数1.设计目的和要求1.1设计目的(1)进一步建立微机系统的概念,加深对系统的理解和认识,培养学生应用微型计算机解决实际问题的能力;(2)进一步学习和掌握汇编语言程序的编写和应用的方法,通过较大规模程序的编写,提高编写汇编语言程序的水平和学习程序调试方法。
(3)进一步熟悉微机最小系统的构成及常用接口芯片的使用,提高系统设计能力。
a)设计要求1.设计汇编语言程序,实现求出500 以内的回文数的功能,具体功能要求如下:如果一个数从左边和从右边读都是相同的数,就称它为回文数,例如383,求出500 以内的回文数并输出显示。
要求:提示数据范围为0-500;换行显示结果。
2.根据功能要求绘制程序流程图、编写完整的汇编语言程序并上机调试2.程序设计说明汇编语言要求设计一个程序来找出0到500以内的回文数,如果一个数从左边和从右边读都是相同的数,就称它为回文数,故设计此程序思维很简单,根据回文数的特性,1至9都为回文数,而在10到500间的回文数需另外求出,因此本程序设计采用分支结构与循环结构相结合。
数据结构回文序列判断实验报告简版
数据结构回文序列判断实验报告数据结构回文序列判断实验报告1. 实验目的本实验旨在探究如何使用数据结构来判断一个序列是否为回文序列,并通过实验验证算法的正确性和效率。
2. 实验背景回文序列是指正向和反向读取都相同的序列。
判断一个序列是否为回文序列可以在很多场景下使用,比如判断一个字符串是否为回文串,或者判断一个数字列表是否为回文数字。
回文序列判断问题是数据结构中非常经典的问题之一,能够有效地练习和运用数据结构的知识。
在本实验中,我们将使用栈来实现回文序列的判断。
3. 实验原理与方法3.1 栈的原理栈是一种数据结构,具有先进后出(Last in, First out,LIFO)的特点。
栈的操作主要有入栈和出栈两个动作,入栈将元素放置在栈顶,出栈则将栈顶元素弹出。
3.2 回文序列判断算法回文序列判断算法的基本思路是将原序列中的元素逐个入栈,然后逐个出栈与原序列中的元素进行比较,若相同则继续比较下一个元素,否则返回不是回文序列。
1. 将原序列中的元素逐个入栈。
2. 逐一出栈栈顶元素,并与原序列中的元素逐个比较。
3. 若任一对应位置的元素不相同,则返回不是回文序列。
4. 若所有元素都相同,则返回是回文序列。
3.3 实验步骤1. 创建一个空栈。
2. 将原序列中的元素逐个入栈,直到全部入栈完成。
3. 出栈栈顶元素,并与原序列中的元素逐个比较。
4. 若比较结果不相同,则返回不是回文序列。
5. 若比较结果都相同,重复步骤3和步骤4,直到栈为空。
6. 若全部比较结果都相同,则返回是回文序列。
4. 实验结果与分析为了验证回文序列的判断算法,我们选择了几个不同长度的序列进行实验,并记录下了实验结果。
4.1 实验结果案例1:序列:abcba实验结果:是回文序列案例2:序列:12321实验结果:是回文序列案例3:序列:abccbaa实验结果:不是回文序列4.2 分析通过以上实验结果可以发现,我们设计的回文序列判断算法在大多数情况下都能够正确判断出序列是否为回文序列。
实验3回文判断
实验题目:回文判断实验描述:判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。
其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。
程序设计#include<stdio.h>#include<stdlib.h>typedef struct Node /*定义队列结点类型*/{char data;struct Node *next;}Linkqueuenode;typedef struct {Linkqueuenode *front; Linkqueuenode *rear;/*分别定义队列的对首和对尾指针*/ }Linkqueue;typedef struct node /*定义栈结点类型*/{char data;struct node *next;}LinkStackNode,*LinkStack;void push( LinkStack top,char x) /*进栈*/{LinkStackNode *temp; /*创建新结点*/temp=(LinkStackNode *)malloc(sizeof(LinkStackNode));temp->data=x;temp->next=top->next;top->next=temp;}void getinmain() /*功能界面*/{printf("\n");printf(" 回文检测 \n");printf("\n\n");printf(" 1. 输入字符串 \n");printf(" 2. 检测是否为回文 \n");printf(" 3. 退出 \n");printf("\n请按指定的数字进行相应的操作:\n");}int queue(Linkqueue *q) /*初始化队列*/{q->front=(Linkqueuenode *)malloc(sizeof(Linkqueuenode));if(q->front!=NULL){q->rear=q->front;q->front->next=NULL;return 1;}else return 0;}int enter(Linkqueue *q,char x) /*入队操作*/{Linkqueuenode *newnode;newnode=(Linkqueuenode *)malloc(sizeof(Linkqueuenode));if(newnode!=NULL){newnode->data=x;newnode->next=NULL;q->rear->next=newnode;q->rear=newnode;return 1;}else return 0;}void pushenter(LinkStack top,Linkqueue *q) /*一个元素同时进栈和入队*/ {printf("请输入元素并以@结束\n");char x;/*进栈和入队的元素*/scanf("%c",&x);while(x!='@'){push(top,x);enter(q,x);scanf("%c",&x);}}void check(LinkStack top,Linkqueue *p){ /*检测是否为回文数*/ Linkqueuenode *q;LinkStack w;w=top->next;q=p->front->next;char a,b;int c=0;while(q!=NULL&&w->next!=NULL){a=w->data;b=q->next->data;q=q->next;w=w->next;printf("a=%c b=%c\n",a,b);if(a!=b)/*检测是否为回文数*/{c=1;printf("不是回文\n");break;}}if(c==0)printf("\n 是回文\n");}void main(){ LinkStackNode top;/*声明一个栈结点*/top.next=NULL;/*将栈顶值为空*/Linkqueue q;queue(&q);/*初始化队列*/system("pause");system("cls");s: getinmain();int b;scanf("%d",&b);switch(b){case 1:pushenter(&top,&q);system("pause");system("cls");goto s; case 2:check(&top,&q);system("pause");system("cls");goto s; case 3:exit(0);};}测试数据1.输入:12345654321@2.输入:msnfhydyhfnsm@3.输入:nf.v01210v.fn@4.输入:ablgj@5.输入:@。
数据结构与算法问题分析及源代码之求回文数判断
求字符串是否为回文数
1 题目
编写一个程序,输入一个字符串,判断该字符串是否“回文”
2 目标
熟悉编译环境,练习将数据结构知识融入程序中,用结构的眼光看数据。
3 设计思想及算法描述
从键盘输入一个数,判断其是否为回文数,并显示。
用数组存储数字符串,利用递归算法从两头开始逐个比较,若出现不等,退出并输出“不是回文”,否则输出“是回文”。
4 程序流程图
5 源程序
#include "stdafx.h"
#include "stdio.h"
#include <iostream.h>
int test(char *s,int bg,int ed)
{
if(s[bg]!=s[ed])return 0;
else if(ed-bg>2)test(s,bg+1,ed-1);
return 1;
}
int main(int argc, int* argv[])
{
char s[50];
gets(s);
if(test(s,0,strlen(s)-1))
cout<<"是回文"<<endl;
else cout<<"不是回文"<<endl;
return 0;
}。
回文实验报告
回文判断实验报告问题描述: (2)一、需求分析 (2)二、概要设计 (3)三、详细设计 (3)四、调试分析 (6)六、测试数据 (6)七、课设总结 (7)问题描述:对于一个从键盘输入的字符串,判断其是否为回文。
回文即正反序相同。
如“abba”是回文,而“abab”不是回文。
一、需求分析(1)数据从键盘读入;(2)输出要判断的字符串;(3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。
二、概要设计抽象数据类型栈定义如下ADT stack{数据对象:D={ai|ai,ElenSet∈i=1,2,……,n,n≥0}数据关系:R1={<a,ai>|1-i a,ai∈D,i=2,……n};1-i约定a端为栈顶,1a端为栈底n基本操作:InitStack(&s)操作结果:构造一个空栈push(&s,e)初始条件:栈s存在操作结果:插入元素e作为新的栈顶元素pop (&s,&e)初始条件:栈s存在操作结果:删除栈s的栈顶元素,并用e返回其值}三、详细设计#include<stdio.h>#include<stdlib.h>#include<string>#define TRUE 1#define FALSE 0#define Stack_Size 100 //定义栈的最大容量#define STACKINCREMENT 10typedef struct{char *base;char *top;int stacksize;}SqStack;int InitStack(SqStack &S)//构造一个空栈{S.base=(char*)malloc(Stack_Size*sizeof(char));if(!S.base)exit(FALSE);S.top=S.base;S.stacksize=Stack_Size;return TRUE;}void Push(SqStack &S,char x)//进栈函数{if(S.top-S.base>=S.stacksize){S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));if(!S.base)exit(FALSE);S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=x;}char Pop(SqStack &S,char &c)//出栈函数{if(S.top==S.base)return FALSE;c=*--S.top;return c;}int main(){SqStack S;InitStack(S);char a[30];char c;char e;int k=0;printf("请输入要转换的的字符串,以#号结束:\n"); for(int i=0;i<30;i++){scanf("%c",&c);if(c!='#'){a[i]=c;}else{k=i;break;}}for(int h=0;h<k;h++){Push(S,a[h]);}int count=0;//定义一个计时器for(int w=0;w<k;w++){char x=Pop(S,e);printf("%c",x);if(a[w]==x){count++;}}printf("\n");if(count==k){printf("是回文\n");return TRUE;}else{printf("不是回文\n");return FALSE;}printf("\n");}四、调试分析对于语句中的一般回文单词能正常输出,句末跟标点符号连在一起的回文单词也能通过程序把字符串末尾的标点给去掉并正常输出,而字符串中的连接符可以作为回文单词的组成部分一起输出。
数据结构C语言版判断回文数实验报告
{ char element[MAX]; int front; int rear; }SeqQuene; //初始化栈 void InitStack(SeqStack *S) { S->top = -1;//构造一个空栈 } //入栈 int Push(SeqStack *S,char x,int cnt) { if(S->top == cnt-1) return(FALSE); S->top++; S->elem[S->top] = x; return(TURE); } //出栈 int Pop(SeqStack * S,char * x) { if(S->top == -1) return(FALSE); else { *x = S->elem[S->top]; S->top--; return(TURE); } } //初始化队列 void InitQuene(SeqQuene *Q) { Q->front = Q->rear = 0; } //入队 int EnterQuene(SeqQuene *Q,char x,int cnt) {
三、数据结构及算法思想 算法思想:从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的 最后一个字符为*停止插入。在程序中设置了一个标志位 flag,将输入的序列分别做入栈、 出栈、入队、出队操作,若出栈与出队的数据完全一致,则将 flag 标志为 1,否则为零。Flag 为 1,则表示该序列是回文序列,否则,为非回文序列。 四、模块划分 1. 对各个模块进行功能的描述 (1)void InitStack(SeqStack *S):栈初始化模块,即初始化一个空栈,随后对该空 栈进行数据的写入操作; (2)int Push(SeqStack *S,char x,int cnt):入栈操作,即给空栈中写入数据,数据长 度有宏定义给出; (3)int Pop(SeqStack * S,char * x):出栈操作,即将栈中的数据输出,由于栈的操 作是先进后出,因此,出栈的数据是原先输入数据的逆序; (4)void InitQuene(SeqQuene *Q):队列初始化,即初始化一个空队列,最后对该 空队列进行数据的写入操作; (5)int EnterQuene(SeqQuene *Q,char x,int cnt):入队操作,即给空队列中写入数 据,数据长度一样有宏定义给出; (6)int DeleteQuene(SeqQuene *Q,char *x,int cnt):出队操作,即将队列中的数据 输出,由于队列的操作是先进先出,因此,出队的数据室原先输入数据的正序; (7)void main():主函数,用于调用前面的模块,进行出队数据与出栈数据的比 较,判断输入的序列是否是回文序列。 2. 模块之间关系及其相互调用的图示
数据结构课程设计回文判断
一、设计题目:编写程序判定一个字符串是否为回文?如“123454321”为回文,“asdfgsa”不是回文。
二、设计要求:1. 根据设计题目写出设计思想,选用适合数据逻辑结构、物理结构。
2. 根据设计题目写出算法描述和算法。
3. 根据课程设计要求打印报告并进行答辩。
三、概要设计 (程序流程图):首先建立一个字符数组,长度为254,然后向数组中写入索要判断的字符串。
定义两个指针,一个指向队头,一个指向队尾,队头的指针不断递增,队尾的指针不断递减,在P1<P2的前提下,两个地址上的数据进行比较,如相等则两地址分别向中间靠拢,如对比的结果不同则跳出,但此时P1指针小于P2指针,所以判断字符串不是回文;如两者一直相等直到他们的地址P1=P2或P1>P2(字符串为奇数个)时,跳出并判断为回文;在这其中P1指针的值与P2指针的值有不等的情况就直接判定不是回文。
四、程序代码测试及结果分析:#include <stdio.h>#include <string.h>int main( void ){char str[254];printf("请输入字符串:");gets( str ); //输入字符char *p1 = str, *p2 = str + strlen(str) - 1;//指针定义for( ; p1 < p2 && *p1 == *p2; ++p1, --p2 );//FOR循环体为空 puts( p1 < p2 ? "所输字符串不是回文" : "所输字符串是回文" ); return 0;}结果分析:如上图例子,在输入123454321时,P1指向第一个1的地址,P2指向最后一个1的地址,FOR语句循环前无定义且为空语句,此时p1<p2且*p1==*p2,继续循环执行循环体为空;以此类推,当程序执行到5次循环,也就是P1和P2的指针都在5的位置时,不满足循环条件p1 < p2 && *p1 == *p2中的p1 < p2,跳出循环,此时同样三目运算符(p1 < p2 ? "所输字符串不是回文" : "所输字符串是回文")中的p1 < p2也不满足其值为假,所以输出为“所输字符串是回文”。
数据结构实验报告(回文)
Boolean mark = true;
string str;
str = Console.ReadLine();
for (i = 0, j = str.Length - 1; i <= j; i++, j--)
{
if (str[i] != str[j])
mark = false;
break;
注:可根据实际情况加页
分析:第一次打开软件的时候,不知道打开何处,不同于以前都是打开窗体应用程序。“static void Main(string[] args)”
实现编程的见面,了解了编程的输入和输出的表达:Console.WriteLine("请输入一个字福串:");inputString =Console.ReadLine().Trim();Console.ReadLine();。
}
if (mark)
System.Console.WriteLine("你输入的是一个回文数!");
else System.Console.WriteLine("你输入的不是一个回文数!");
Console.ReadLine();
}
}
}
实验环境
计算机实验室,安装有VS电脑一台。
实验结果与
分析
运行以上的程序并输入一串代码得到如下的结果:
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
数据结构课程设计回文数问题
湖南科技学院课程设计报告课程名称:数据结构课程设计课程设计题目:02、回文问题系:专业:年级、班:姓名:学号:指导教师:职称:2011年12月目录1.问题描述----------------------------------------------------------------------32.具体要求----------------------------------------------------------------------33.测试数据----------------------------------------------------------------------34.算法思想----------------------------------------------------------------------35.模块划分----------------------------------------------------------------------46.数据结构----------------------------------------------------------------------47.源程序------------------------------------------------------------------------78.测试情况--------------------------------------------------------------------149.设计总结--------------------------------------------------------------------1410.参考文献--------------------------------------------------------------------15一、问题描述利用栈跟队列找出一个TXT文档中所有的回文单词并输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖南科技学院课程设计报告课程名称:数据结构课程设计课程设计题目:02、回文问题系:专业:年级、班:姓名:学号:指导教师:职称:2011年12月目录1.问题描述----------------------------------------------------------------------32.具体要求----------------------------------------------------------------------33.测试数据----------------------------------------------------------------------34.算法思想----------------------------------------------------------------------35.模块划分----------------------------------------------------------------------46.数据结构----------------------------------------------------------------------47.源程序------------------------------------------------------------------------78.测试情况--------------------------------------------------------------------149.设计总结--------------------------------------------------------------------1410.参考文献--------------------------------------------------------------------15一、问题描述利用栈跟队列找出一个TXT文档中所有的回文单词并输出。
回文单词就是单词中字母从前往后拼与从后往前拼得出的单词是一样的,如:AaA、121、1221、d、did等,从数据结构角度看,栈和队列是特殊的线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表,而栈是一种限定仅在表尾进行插入或删除的线性表,栈的修改是按先进后出的顺序进行的,队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端进行删除,因此可利用栈和队列的这两个性质对一个单词是否为回文单词进行检测,如果是则输出这个单词即可。
一句话里可能既包含字母、数字还可能包含标点符号,回文单词的判断是不包含标点符号的,但文件输入流读取的时候标点也被一起读取进来了,因此要删除紧跟单词后中的标点符号,单独对各个单词进行判断。
二、具体要求此课程设计要求编写程序以实现检测出文档中的回文单词并将其输出的功能,首先要将每一个单词从文档读取出来,其次对每一个单词进行回文判断,主程序用栈和队列实现,以进一步巩固、理解和熟练掌握栈和队列的基本操作;同时对文本文件进行读取数据要利用到文件输入流的知识。
三、测试数据用文本文档data.txt,进行测试,输出回文数,及个数。
文本文档中除英文字母,数字,常见标点符号外无其他字符,并且编码采用常见的ANSI编码。
四、算法思路1、初始化栈和队列,读入TXT文本文档,若文档不能正常读入,则输出文档读入错误,若正常读入,文档非空则将文档中的单词逐个读入到字符串中。
2、因为标点符号都是紧跟单词后的,故对每个字符串首先得判断最后一个字符c,若c既不是字母也不是数字,字符串的长度减一,即以标点符号结束的字符串最后一个字符不压入栈跟队列,不参与回文单词的判断。
3、调用出栈与出队列函数,逐个比较出栈与出队列字符是否一样,用count 记录栈中出来的与队列出来的相同字符的个数,若count==str .length()则说明该字符串从栈中出来跟从队列出来完全一样,即字符串完全对称,为回文单词,输出,回文单词加一个,否则什么也不做。
4、读取至文本文档最后时,程序结束,关闭文本文档,同时销毁队列。
5、假设文本文档中除英文字母,数字,常见标点符号外无其他字符,并且编码采用常见的ANSI编码。
五、模块划分函数功能:void initStack(SqStack& s);//构造一个空栈svoid clearStack(SqStack& s);//清空栈bool isEmpty(SqStack& s);//判断栈是否为空bool isFull(SqStack& s);//判断栈是否满void push(SqStack& s,const char& e);//插入元素e为s的新的栈顶元素(进栈)char pop(SqStack& s);//若栈不空,则删除s的栈顶元素(出栈)void initQueue(LinkQueue& q);//构造一个空队列qbool isEmpty(LinkQueue q);//判断队列是否为空void destroyQueue(LinkQueue& q);//销毁队列void insertElem(LinkQueue& q,char e);// 插入元素e为q的新的队尾元素(进队列)char deleteElem(LinkQueue& q);//若队列不空,则删除q的对头元素(出队列)六、数据结构定义栈:struct SqStack //定义栈{char base[MAXSIZE];int top;};定义队列:struct QNode //定义队列结点{char data;QNode* next;};struct LinkQueue// 定义队列{QNode* front;QNode* rear;};图示:栈图示:队列,插入元素抽象数据类型栈定义如下ADT stack{数据对象:D={ai|ai,∈i=1,2,……,n,n≥0}ElenSet数据关系:R1={<1-i a ,ai >|1-i a ,ai ∈D,i=2,……n};约定n a 端为栈顶,1a 端为栈底基本操作:InitStack(&s)操作结果:构造一个空栈clearStack(&s)初始条件:栈s 存在操作结果:将栈s 清空为空栈isEmpty(&s)初始条件:栈s 存在操作结果:判断栈是否为空,为空返回true,否则返回false; isFull(&s)初始条件:栈s 存在操作结果:判断栈是否满,满返回true,否则返回false; push(&s,e)初始条件:栈s 存在操作结果:插入元素e 作为新的栈顶元素pop (&s,&e)初始条件:栈s 存在操作结果:删除栈s 的栈顶元素,并用e 返回其值}ADT stack{数据对象:D={ai |ai ,ElenSet ∈i=1,2,……,n,n ≥0}数据关系:R1={<1-i a ,ai >|1-i a ,ai ∈D,i=2,……n};约定n a 端为队列尾,1a 端为队列头基本操作:initQueue(&q);操作结果:构造一个空队列qisEmpty(q)初始条件:队列q存在操作结果:判断队列是否为空,为空返回true,否则返回false destroyQueue(&q)初始条件:队列q存在操作结果:销毁队列qinsertElem(&q,e)初始条件:队列q存在操作结果:插入元素e为q 的新的队尾元素deleteElem(&q)初始条件:队列q存在操作结果: 若队列不空,则删除q的对头元素}新定义数据类型:MAXSIZE 数据类型 int七、源程序Sqstack.h#ifndef SQSTACK_H_INCLUDED#define SQSTACK_H_INCLUDEDconst int MAXSIZE=150;struct SqStack //定义栈{char base[MAXSIZE];int top;};void initStack(SqStack& s);//构造一个空栈svoid clearStack(SqStack& s);//清空栈bool isEmpty(SqStack& s);//判断栈是否为空bool isFull(SqStack& s);//判断栈是否满void push(SqStack& s,const char& e);//插入元素e为s的新的栈顶元素(进栈)char pop(SqStack& s);//若栈不空,则删除s的栈顶元素(出栈)#endif // SQSTACK_H_INCLUDEDSqStack.h#include<iostream>#include<cstring>#include<cstdlib>#include"SqStack.h"using namespace std;void initStack(SqStack& s)//构造一个空栈s{s.top=0;}void clearStack(SqStack& s){s.top=0;}bool isEmpty(SqStack& s){return(s.top==0);}bool isFull(SqStack& s){return(s.top==MAXSIZE);}void push(SqStack& s,const char& e)//插入元素e为s的新的栈顶元素(进栈){if (s.top==MAXSIZE){cerr<<"Stack overflow!"<<endl;exit(1);}s.base[s.top]=e;++s.top;}char pop(SqStack& s)//若栈不空,则删除s的栈顶元素(出栈){if (s.top==0){cerr<<"Stack is empty!"<<endl;exit(1);}--s.top;char temp=s.base[s.top];return temp;}LinkQueue.h#ifndef LINKQUEUE_H_INCLUDED#define LINKQUEUE_H_INCLUDEDstruct QNode //定义队列结点{char data;QNode* next;};struct LinkQueue// 定义队列{QNode* front;QNode* rear;};void initQueue(LinkQueue& q);//构造一个空队列qbool isEmpty(LinkQueue q);//判断队列是否为空void destroyQueue(LinkQueue& q);//销毁队列void insertElem(LinkQueue& q,char e);// 插入元素e为q的新的队尾元素(进队列)char deleteElem(LinkQueue& q);//如队列不空,则删除q的对头元素(出队列)#endif // LINKQUEUE_H_INCLUDEDLinkQueue.cpp#include<iostream>#include<cstring>#include<cstdlib>#include"LinkQueue.h"using namespace std;void initQueue(LinkQueue& q) //构造一个空队列q{q.front=q.rear=new QNode;if (!q.front)exit(1);q.front->next=NULL;}void destroyQueue(LinkQueue& q){while (q.front){q.rear=q.front->next;delete q.front;q.front=q.rear;}}void insertElem(LinkQueue& q,char e)// 插入元素e为q的新的队尾元素(进队列){QNode* p=new QNode;p->data=e;p->next=NULL;q.rear->next=p;q.rear=p;}char deleteElem(LinkQueue& q)//如队列不空,则删除q的对头元素(出队列){if (q.front==q.rear){cerr<<"Queue is empty!"<<endl;exit(1);}QNode* p=q.front->next;char e=p->data;q.front->next=p->next;if (q.rear==p) //若队列中只剩一个元素q.rear=q.front;//删除最后一个元素,链队为空,则需同时使队尾指针指向头结点delete p;return e;}bool isEmpty(LinkQueue q){return q.front==q.rear;}main.cpp#include<iostream>#include<cstring>#include<fstream>#include<cstdlib>#include"SqStack.h"#include"LinkQueue.h"using namespace std;int main(){string str;int i,sum=0;LinkQueue q;SqStack s;initStack(s);if(isEmpty(s)){cout<<"栈初始化成功!"<<endl;}initQueue(q);if(isEmpty(q));{cout<<"队列初始化成功!"<<endl;}ifstream infile("data.txt");if(!infile)cout<<"读入文本文件发生错误"<<endl;cout<<"**************文本文件中回文单词如下***************"<<endl;while (infile.eof()==0){int count=0;infile>>str;i=str.length();char c=str[i-1];if (c>='a'||c<='z'||c>='A'||c<='Z');elsei--;for (int j=0; j<i; j++){push(s,str[j]);insertElem(q,str[j]);}for (int k=0; k<i; k++)if (pop(s)==deleteElem(q))count++;if (count==i&&infile.eof()==0){for (int n=0; n<i; n++)cout<<str[n];cout<<" ";sum++;}}infile.close();cout<<endl;cout<<"此文本文档中共有回文单词:"<<sum<<"个" <<endl; cout<<"****************************************"<<endl; clearStack(s);if(isEmpty(s)){cout<<"栈销毁成功!"<<endl;}destroyQueue(q);if(isEmpty(q));{cout<<"队列销毁成功!"<<endl;}return 0;}八、测试情况测试结果分析对于语句中的一般回文单词能正常输出,句末跟标点符号连在一起的回文单词也能通过程序把字符串末尾的标点给去掉并正常输出,而字符串中的连接符可以作为回文单词的组成部分一起输出。