回文判断
实验报告
运行结果:
运行程序输入一段字符串,运行不同的结果如图2、3所示:
图2 不是回文的判断结果
图3 是回文的判断结果
实验总结:
通过前两次的实验,使我对C语言和数据结构有许多认识。因此,这次实验在做起来时多少有点思路,但是在实验室当中还是遇到了许多不会的问题,如回文的判断思路、以及函数的调用等等,不过这些问题在老师和同学的帮助下基本完成了这次实验。这次实验让我学到了很多知识,让我对原来所学的又重新复习了一遍,同时还学到了许多其他新知识。
附:源程序:
#include
#include
#define OK 1
#define ERROR 0
#define Maxsize 100
typedef struct
{ char elem[Maxsize];
int top;
}Seqstack;
void init_seqstack(Seqstack *s) //初始化
{
s->top=-1;
}
int push_seqstack(Seqstack *s,char x) //进栈{
if(s->top==Maxsize-1)
{
printf("***********栈已满***********!\n");
return ERROR;
}
else
{ s->top++;
s->elem[s->top]=x;
return OK;
}
}
int pop_seqstack(Seqstack *s) //出栈
{ char x;
if(s->top==-1)
{ printf("************栈已空**********!\n"); return ERROR;
}
else
{ x=s->elem[s->top];
s->top--;
}
return x;
int gettop_seqstack(Seqstack *s) //取栈顶元素{ char x;
if(s->top==-1)
{
printf("**********栈已满***********!\n"); return ERROR;
}
else
x=s->elem[s->top];
return x;
}
int Ishuiwen(char *s) //判断是否是回文{
Seqstack *STK,stack; char *p;
int n; n=strlen(s);
STK=&stack;
init_seqstack(STK);
push_seqstack(STK,'#');
if(n%2==0)
{ p=s+n/2;
while(s!=p)
{ push_seqstack(STK,*s);
s++;
}
}
else
{ p=s+(n+1)/2;
while(s!=p-1)
{ push_seqstack(STK,*s);
s++;
}
}
while(STK->top!=-1 && gettop_seqstack(STK)!='#') { if(*p!=pop_seqstack(STK))
return ERROR;
p++;
}
return OK;
}
void main()
{ char s[100];
printf("请输入字符串:");
gets(s);
int x;
x=Ishuiwen(s);
if(x==1)
printf("%s 是回文!\n",s);
else
printf("%s 不是回文!\n",s);
}
堆栈方式实现字符回文数判断(可运行)
设线性表A中有n个字符,试设计程序判断字符串是否中心对称,例如xyzyx和xyzzyx都是中心对称的字符串。 #include
void push(listack *& s,elemtype e) { listack *p; p=(listack*)malloc(sizeof(listack)); p->data=e; p->next=s->next; s->next=p; } int pop(listack *&s,elemtype &e) { listack *p; if(s->next==NULL) return 0; p=s->next; e=p->data; s->next=p->next; free(p); return 1; } int gettop(listack *s,elemtype &e) { if(s->next==NULL) return 0; e=s->next->data; return 1; } int judge(char *str) { listack *s;elemtype e; initstack(s); char *p=str; while(*p!='#') { push(s,*p); p++; } while(!stackempty(s)) { pop(s,e); if(e!=*str) return 0; str++; } return 1;
回文判断教学总结
实验报告 系部计算机系I班级I I学号I I姓名课程名称—数据结构I实验日期实验名称回文判断成绩 实验目的: 掌握栈的基本操作:入栈、出栈等在链式或顺序存储结构上的实现。 实验条件:PC机一台、VC++6.0编译环境 实验内容与算法思想: 内容: 输入一字符串判断其是否为回文。 算法思想: 1. 算法中主要用到的函数 ①void mai n() //主函数 ②int push_seqstack(Seqstack *s,char x) // 进栈 ③in t pop_seqstack(Seqstack *s) // 出栈 ④int gettop_seqstack(Seqstack *s) 〃取栈顶元素 ⑤int Ishuiwe n( char *s) 〃判断是否是回文 2. 函数之间的调用关系 函数之间的调用关系如图1所示:
图1函数之间的调用关系 运行结果: 运行程序输入一段字符串,运行不同的结果如图2、3所示: 图2 不是回文的判断结果 实验总结: 通过前两次的实验,使我对C语言和数据结构有许多认识。因此,这次实验 在做起来时多少有点思路,但是在实验室当中还是遇到了许多不会的问题,如回文的判断思路、以及函数的调用等等,不过这些问题在老师和同学的帮助下基本完成了这次实验。这次实验让我学到了很多知识,让我对原来所学的又重新复习了一遍,同时还学到了许多其他新知识。 附:源程序: #in clude
最长回文子串
[转]最长回文子串O(n) 这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长, 这个算法有一个很巧妙的地方,它把奇数的回文串和偶数的回文串统一起来考虑了。这一点一直是在做回文串问题中时比较烦的地方。这个算法还有一个很好的地方就是充分利用了字符匹配的特殊性,避免了大量不必要的重复匹配。 算法大致过程是这样。先在每两个相邻字符中间插入一个分隔符,当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串统一起来考虑了(见下面的一个例子,回文串长度全为奇数了),然后用一个辅助数组P记录以每个字符为中心的最长回文串的信息。P[id]记录的是以字符str[id]为中心的最长回文串,当以str[id]为第一个字符,这个最长回文串向右延伸了P[id]个字符。 原串:waabwswfd 新串:# w # a # a # b # w # s # w # f # d # 辅助数组P: 1 2 1 2 3 2 1 2 1 2 1 4 1 2 1 2 1 2 1 这里有一个很好的性质,P[id]-1就是该回文子串在原串中的长度(包括‘#’)。 (证明: 1,显然l=2*p【i】-1即为新串中以s【i】为中心的最长回文串长度。 2,以s【i】为中心的回文串定以#开头和结尾,则l-1为原串长度的2 倍 证毕) 好,我们继续。现在的关键问题就在于怎么在O(n)时间复杂度内求出P数组了。只要把这个P数组求出来,最长回文子串就可以直接扫一遍得出来了。 由于这个算法是线性从前往后扫的。那么当我们准备求P[i]的时候,i以前的P[j]我们是已经得到了的。我们用mx记在i之前的回文串中,延伸至最右端的位置。同时用id这个变量记下取得这个最优mx时的id值。(注:为了防止字符比较的时候越界,我在这个加了‘#’的字符串之前还加了另一个特殊字符‘$’,故我的新串下标是从1开始的) 好,到这里,我们可以先贴一份代码了。 复制代码 1. void pk() { int i; int mx = 0; int id; for(i=1; i
C语言回文数猜想
2.7.1.1 练习1 回文数的猜想 1输入一个数 2一个数,加上是这个数的倒序数,得出结果 3判断是否为回文数,是就退出,否则返回第2步骤 回文数:1336331、9559 典型:输入1735 1753+3571=5324 5324+4235=9559 9559就是一个回文数 程序解答过程: 1设计出各函数功能,便于调用 2编码,解答 各函数功能: 输入数据:int input(void) 对数据取逆序:int reverse(int data) 判断回文数:int ispalin(int data) 溢出判断:int isover(int data //palin.c #include
int reverse(int data) { int res=0; for(;data>0;data=data/10)//取得data的的逆序 res=res*10+data%10;//data%10取得data最后一位数字 return res; } int ispalin(int data) { return data==reverse(data); } int isover(int data) { return data<=0||reverse(data)<=0;//当data大小越界,即超过2^31-1,变成负数 } int main() { int data=input(); int i; for(i=0;!isover(data);data+=reverse(data)) { if(!ispalin(data)) printf("[%d]:%d+%d=%d\n",++i,data,reverse(data),data+reverse(data)); else { printf("Palin:%d\n",data); return 0; } } printf("Can not find Palin!\n"); return 0; } 知识:unsigned int:2^32-1 int : 2^31-1 超过了最大值会越界,越界的数会变成负数
回文判断实验二
回文判断实验二
洛阳理工学院实验报告 系别计算机系班级B13053 学号B13053235 姓名李登辉 2 课程名称数据结构实验日期2014.3.28 实验名称栈和队列的基本操作成绩 实验目的: 熟悉掌握栈和队列的特点,掌握与应用栈和队列的基本操作算法,训练和提高结构化程序设计能力及程序调试能力。 实验条件: 计算机一台,Visual C++6.0
实验内容: 1.问题描述 利用栈和队列判断字符串是否为回文。称正读与反读都相同的字符序列为“回文”序列。要求利用栈和队列的基本算法实现判断一个字符串是否为回文。栈和队列的存储结构不限。 2.数据结构类型定义 typedef struct { char elem[MAX]; int top; }SeqStack; 顺序栈 3.模块划分 void InitStack(SeqStack *S):栈初始化模块, int Push(SeqStack *S,char x,int cnt):入栈操作 int Pop(SeqStack * S,char * x):出栈操作 void InitQuene(SeqQuene *Q):队列初始化 int EnterQuene(SeqQuene *Q,char x,int cnt):入队操作 int DeleteQuene(SeqQuene *Q,char *x,int cnt):出队操作 void main():主函数 4.详细设计 #include
回文串实验报告
回文串实验报告 课程名称:数据结构 实验名称:单链表 学生姓名:杜克强 学生学号: 201207092427
实验一回文串的基本操作及其应用 一、实验目的 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。 2、掌握栈和队列的特点,即后进先出和先进先出的原则。 3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序 存储结构和链式存储结构上的实现。 二、实验内容和要求 [问题描述] 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。 [基本要求] (1)数据从键盘读入; (2)输出要判断的字符串; (3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。 [测试数据] 由学生任意指定。 三、实验步骤 1.需求分析 本演示程序用C语言编写,完成对一个字符串是否是回文字符串的判断 ①输入一个任意的字符串; ②对输入的字符串进行判断是否为回文串;
③输出判断结果; ④测试数据: A.依次输入“abccba”,“asddas”等数据; B.输出判断结果“Yes”,“No”等 四、算法设计 1、算法思想: 把字符串中的字符逐个分别存储到队列和堆栈中,然后逐个出队和出栈并比较出队列的数据元素和退栈的数据元素是否相等,若相等则是会文,否则不是。 2、模块设计 (1)int Palindrome_Test()判断字符序列是否为回文串; (2)Status main()主函数; (3)Status CreatStack(SqStack &S)创建一个栈; (4)Status Push(SqStack &S,SElemType e)入栈; (5)Status Pop(SqStack &S ,SElemType &e)出栈; (6)Status CreatQueue(LinkQueue &Q)创建一个队列; (7)Status EnQueue(LinkQueue &Q,QElemType e)入队; (8)Status DeQueue(LinkQueue &Q,QElemType &e)出队;
求回文子串 O(n) manacher算法
求回文子串O(n) manacher算法 回文串定义:“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。 回文子串,顾名思义,即字符串中满足回文性质的子串。 经常有一些题目围绕回文子串进行讨论,比如HDOJ_3068_最长回文,求最长回文子串的长度。朴素算法是依次以每一个字符为中心向两侧进行扩展,显然这个复杂度是O(N^2)的,关于字符串的题目常用的算法有KMP、后缀数组、AC自动机,这道题目利用扩展KMP 可以解答,其时间复杂度也很快O(N*logN)。但是,今天笔者介绍一个专门针对回文子串的算法,其时间复杂度为O(n),这就是manacher算法。 大家都知道,求回文串时需要判断其奇偶性,也就是求aba和abba的算法略有差距。然而,这个算法做了一个简单的处理,很巧妙地把奇数长度回文串与偶数长度回文串统一考虑,也就是在每个相邻的字符之间插入一个分隔符,串的首尾也要加,当然这个分隔符不能再原串中出现,一般可以用‘#’或者‘$’等字符。例如: 原串:abaab 新串:#a#b#a#a#b# 这样一来,原来的奇数长度回文串还是奇数长度,偶数长度的也变成以‘#’为中心的奇数回文串了。 接下来就是算法的中心思想,用一个辅助数组P记录以每个字符为中心的最长回文半径,也就是P[i]记录以Str[i]字符为中心的最长回文串半径。P[i]最小为1,此时回文串为Str[i]本身。 我们可以对上述例子写出其P数组,如下
新串:# a # b # a # a # b # P[] : 1 2 1 4 1 2 5 2 1 2 1 我们可以证明P[i]-1就是以Str[i]为中心的回文串在原串当中的长度。 证明: 1、显然L=2*P[i]-1即为新串中以Str[i]为中心最长回文串长度。 2、以Str[i]为中心的回文串一定是以#开头和结尾的,例如“#b#b#”或“#b#a#b#”所以L减去最前或者最后的‘#’字符就是原串中长度的二倍,即原串长度为(L-1)/2,化简的P[i]-1。得证。 依次从前往后求得P数组就可以了,这里用到了DP(动态规划)的思想,也就是求P[i]的时候,前面的P[]值已经得到了,我们利用回文串的特殊性质可以进行一个大大的优化。我先把核心代码贴上: for(i=1;i
Java第一次作业-回文素数
《Java语言》课程作业 (第一次) 题目第8题 学院计算机学院专业 班别 学号 姓名陈聪 2015年4月22日
一、课程题目 8、题目:回文素数 回文素数是指一个数同时为素数和回文数。例如:131是一个素数,同时也是一个回文数。数字313和757也是如此。编写程序,显示前100个回文素数,每行显示10个数并且准确对齐,如下所示: 2 3 5 7 11 101 131 151 181 191 313 353 373 383 727 757 787 797 919 929 ……. …. …. ………………. [选题人数:3] 二、题目分析与设计 1、题目的需求:编写程序,显示前100个回文素数,每行显示10个数并且准确对齐。 2、制定对应程序的功能: (1)将2以后的素数挑选出来,直到显示完前100个回文素数:利用for循环。 (2)判断挑选出来的素数是否为回文数:通过将原素数倒置再与原素数比较来判断。 (3)输出回文素数,同时判断是否要换行,通过确定位数来使回文素数准确 对齐。 3、(1)程序功能层次图: (2)程序结构流程图: