判断回文数字

判断回文数字
判断回文数字

判断回文数字

【代码】

import java.util.Scanner;

public class WhileCycle_05 {

public static void main(String[] args) { int n;

System.out.println("请输入一个整数: ");

while(true){

Scanner scByte =new Scanner(System.in);

n=scByte.nextInt();

if(ispalindrome(n)){

System.out.println(n+"是回文!");

break;

}else{

System.out.println(n+"不是回文!!");

}

}

}

public static boolean ispalindrome(int n){ int m=reverse(n);

if(m==n)

return true;

else

return false;

}

public static int reverse(int i){ int s,j=0;

s=i;

while(s!=0){

j=j*10+s%10;

s=s/10;

}

return j;

}

}

【运行效果】

C:\Users\Administrator\AppData\Roaming\360se6\Application\360se.exe -----精心整理,希望对您有所帮助!

堆栈方式实现字符回文数判断(可运行)

设线性表A中有n个字符,试设计程序判断字符串是否中心对称,例如xyzyx和xyzzyx都是中心对称的字符串。 #include #include #include #include using namespace std; #define max 100 typedef char elemtype; typedef struct node { elemtype data; struct node *next; }listack; void initstack(listack *&s) { s=(listack*)malloc(sizeof(listack)); s->next=NULL; } int stacklength(listack *s) { int i=0; listack *p; p=s->next; while(p!=NULL) { i++; p=p->next; } return i; } void clearstack(listack *s) { listack *p=s->next; while(p!=NULL) { free(s); s=p; p=p->next; } } int stackempty(listack *s) { return(s->next==NULL);

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;

最长回文子串

[转]最长回文子串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 i ) p[i] = MIN( p[2*id-i], mx-i ); else p[i] = 1; for(; str[i+p[i]] == str[i-p[i]]; p[i]++) ; if( p[i] + i > mx ) { mx = p[i] + i; id = i; } } } 代码是不是很短啊,而且相当好写。很方便吧,还记得我上面说的这个算法避免了很多不必要的重复匹配吧。这是什么意思呢,其实这就是一句代码。 if( mx > i) p[i]=MIN( p[2*id-i], mx-i); 就是当前面比较的最远长度mx>i的时候,P[i]有一个最小值。这个算法的核心思想就在这里,为什么P数组满足这样一个性质呢? (下面的部分为图片形式)

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 input(void) { int data=-1;//防止赋值失败? for(;;) { scanf("%d",&data); if(data>=10)//使得输入的数字不小于10 break; scanf("%*[^\n]");//取得除了换行\n之外的所有字符,抛掉 scanf("%*c");//抛掉换行\n } return data; }

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 超过了最大值会越界,越界的数会变成负数

回文串实验报告

回文串实验报告 课程名称:数据结构 实验名称:单链表 学生姓名:杜克强 学生学号: 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;ii) { p[i]=Min(p[2*id-i],MaxId-i); } else { p[i]=1; } while(a[i+p[i]]==a[i-p[i]]) { p[i]++; } if(p[i]+i>MaxId) { MaxId=p[i]+i; id=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)程序结构流程图:

4、所使用的开发环境:Eclipse (1)判断一个数是否为素数: i=2; while(i

while(s!=0) { b=b*10+s%10; s=s/10; } (3)判断素数是否为回文数并输出: if(a==b) { n++; if(n%10==0) System.out.printf("%8d\n",a); else System.out.printf("%8d",a); } 三、测试分析 1、题目的需求:编写程序,显示前100个回文素数,每行显示10个数并且准确对齐。因此本程序不需要构建测试数据。 2、运行程序的结果如下: 所得到的前一百个回文素数与预计结果一致,格式正确,每行显示10个数并且准确对齐。 附录:源代码 package hui; public class huiwen{ public static void main(String args[]){ int a,b,s;

回文(数据结构)

//借助栈和链队列判断序列是否回文 #include #include #define ERROR 0 #define OK 1 #define STACK_INT_SIZE 10 /*存储空间初始分配量*/ #define STACKINCREMENT 5 /*存储空间分配增量*/ typedef char ElemType; /*定义元素的类型*/ typedef struct{ ElemType *base; ElemType *top; int stacksize; /*当前已分配的存储空间*/ }SqStack; typedef struct QNode{ ElemType data; struct QNode *next; }QNode,*Queue; typedef struct{ Queue front; Queue rear; }LinkQueue; int InitStack(SqStack *S){ S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base; S->stacksize=STACK_INT_SIZE; return OK; }/*InitStack*/ int Push(SqStack *S,ElemType e){ if(S->top-S->base>=S->stacksize){ S->base=(ElemType*)realloc(S->base,(STACK_INT_SIZE+STACKINCREMENT)*sizeof(ElemType)); if(!S->base) return ERROR; S->top=S->base+S->stacksize;S->stacksize=S->stacksize+STACKINCREMENT; } *S->top++=e; return OK; }/*Push*/ int Pop(SqStack *S,ElemType &e){

回文判断实验报告

回文判断实验报告 一.实验题目:回文判断 二.实验目的: 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。 三.实验需求: 1.数据从键盘读入; 2.输出要判断的字符串; 3.利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”否则输出“No” 四.主要实现函数 (1)建立顺序栈存储结构 typedef struct { } (2)初始化 int initstack(Sqstack &s,int maxsize) (3)入栈 int enstack(Sqstack &s, char e) (4)出栈 int popstack(Sqstack &s,char &e) (5)判断是否为回文 int main() { int r; //用于判断是否为回文 Sqstack L,Q; //定义两个栈

initstack(L,20); initstack(Q,20); int l; //用于记录输入字符的长度cout<<"请输入字符串长度"; cin>>l; if(l<=0)exit(1); cout<<"输入字符"<>p; enstack(L,p); //入栈 L } cout< using namespace std; typedef char SElemType; typedef struct { SElemType *base; SElemType *top; int stacksize;

数据结构C语言版判断回文数试验报告

. 数据结构实验报告判断回文数 级班: 内序号班: 名生姓学: 教师导指: 时间: 201124月年10日

一、实验目的'. . 熟悉栈和队列的各项操作,区别栈和队列的操作原理。 二、实验内容 利用栈的操作完成读入的一个以*结尾的字符序列是否是回文序列的判断。 回文序列即正读与反读都一样的字符序列,例如:43211234*是回文序列,而789678*不是。三、数据结构及算法思想 算法思想:从键盘上读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为*停止插入。在程序中设置了一个标志位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.模块之间关系及其相互调用的图示 '. .

1004 绝对回文数

绝对回文数 Time Limit:10000MS Memory Limit:65536K Total Submit:30 Accepted:16 Description 绝对回文数,即其十,二进制均为回文,输入一个n值(<=100000),判断其是否为绝对回文数(二进制最前面的0不能算) ,若不是,输出”no”(不包括引号),若是,请按格式十进制值(二进制值),比如n=99时,其为绝对回文数,则输出99(1100011) 。 Input 一个n值。 Output 一行,按文中要求输出相应结果。 Sample Input 99 Sample Output 99(1100011) Source

?var ? i,j,n,l,l2:longint; ? a,b:array[1..100] of longint; ? bbt,flag:boolean; ?begin ? readln(n); ? l:=0; j:=n; ? while j<>0 do begin ? inc(l); ? a[l]:=j mod 10; j:=j div 10; ? end; ? l2:=0; j:=n; ? while j<>0 do begin ? inc(l2); ? b[l2]:=j mod 2; j:=j div 2; ? end; ? flag:=true; bbt:=true; ? for i:=1 to l div 2 do if a[i]<>a[l-i+1] then begin ? bbt:=false; break; ? end; ? if not bbt then flag:=false; ? bbt:=true; ? for i:=1 to l2 div 2 do if b[i]<>b[l2-i+1] then begin ? bbt:=false; break; ? end; ? if not bbt then flag:=false; ? if flag then begin ? for i:=1 to l do write(a[i]); write('('); ? for i:=1 to l2 do write(b[i]); ? writeln(')'); ? end ? else writeln('no'); ?end.

用栈和队列判断回文

用栈和队列判断回文 栈和队列实验二 一、实验目的 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。 2、掌握栈和队列的特点,即后进先出和先进先出的原则。 3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队 等运算在顺序存储结构和链式存储结构上的实现。二、实验内容 1(请简述栈的基本特性和栈的几种基本操作的机制 栈是限定仅在表位进行插入或删除操作的线性表,栈的修改是按照后进先出的原则进行的,根据这种特性进行回文判断。 [问题描述] 对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。[基本要求] (1)数据从键盘读入; (2)输出要判断的字符串; (3)利用栈的基本操作对给定的字符串判断其是否是回文, 若是则输出“该字符串是回文”,否则输出“该字符串不是 回文”。 [测试数据] 由学生任意指定。 2(设计简单的程序实现用栈判断回文 #include #include

#include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct{ char *base; char *top; int stacksize; 1 }SqStack; void InitStack(SqStack &S){ S.base =(char *)malloc(STACK_INIT_SIZE * sizeof(char)); if(!S.base)exit(0); S.top = S.base; S.stacksize = STACK_INIT_SIZE;} void Push(SqStack &S,char e){ if(S.top - S.base >= S.stacksize){ S.base = (char *) realloc (S.base,(S.stacksize + STACKINCREMENT) * sizeof(char)); if(!S.base) printf("存储分配失败~"); S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; }

回文问题

问题描述:编程序判断一个字符列是否是回文。回文是指一个字符序列以中间字符为基准两边字符完全相同。要求程序从键盘输入一个字符串,字符串长度小于等于80,用于判断回文的字符串中不包括字符串的结束标记符。 基本要求: (1)要求字符序列个数n可由用户随意确定,且有0top=0; } int StackNotEmpty(SeqStack S) //判断顺序堆栈S非空否,非空时返回1,否则返回0 { if(S.top<=0) return 0; else return 1; }

最长回文子串模板 (Manacher算法,时间复杂度O(n))

//最长回文子串模板 //hdu3068,最长回文子串模板,Manacher算法,时间复杂度O(n),相当快#include #include #include usingnamespacestd; #defineM 200050 charstr1[M],str[2*M];//start from index 1 intrad[M],nn,n; voidManacher(int*rad,char*str,intn)/*str是这样一个字符串(下标从1开始): 举例: 若原字符串为"abcd",则str为"$#a#b#c#d#",最后还有一个终止符。n为str的长度,若原字符串长度为nn,则n=2*nn+2。 rad[i]表示回文的半径,即最大的j满足str[i-j+1...i] = str[i+1...i+j], 而rad[i]-1即为以str[i]为中心的回文子串在原串中的长度*/{ inti; intmx = 0; intid; for(i=1; i i ) rad[i] = rad[2*id-i]

mx-i;else rad[i] = 1; for(; str[i+rad[i]] == str[i-rad[i]]; rad[i]++);if( rad[i] + i > mx ){mx = rad[i] + i; id = i;}}}intmain(){inti,ans,Case=1; while(scanf("%s",str1)!=EOF){}nn=strlen(str1); n=2*nn+2; str[0]='$'; for(i=0;i<=nn;i++){} Manacher(rad,str,n); ans=1; for(i=0;ians?rad[i]: ans; printf("%d\n",ans-1); str[2*i+1]='#'; str[2*i+2]=str1[i]; return0;}//扩展kmp版,时间复杂度O(nlogn),稍慢 //hdu3068 /*给一个w长的字符串,求最长回文子串的长度 解题思路: 不是传说中的高深的后缀数组,而是扩展的kmp算法。

回文判断

设计题目<二>: 3.4.4回文判断P59 1.设计要求 1.1问题描述 试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如“序列1&序列2”模式的字符序列。其中序列1和序列2中都不含字符“&”,且序列2是序列1的逆序列。例如:“a+b&b+a”是属该模式的字符序列,而“1+3&3-1”则不是。 1.2需求分析 这是一个利用栈结构完成的程序。为了实现算术优先算法,我们使用两个工作栈,一个称为操作符栈(OPTR),用以寄存运算符;一个称为操作数栈(OPND),用以寄存操作数或运算结果。算法的基本思想是: (1)输入测试数据组数,接着分组输入字符串,以@结尾。 (2)输入序列总长不超过(MAX_N = 10005)/2个。将序列1先入栈,接着处理序列2,同时出栈判断。 (3)将序列1全部入栈,接着输入序列2,同时出栈判断。 (4)如果序列满足题目要求,则输出“回文序列”;否则,输出“非回文序列”。 (5)测试数据: qwer&rewq@ qwerrewq@ qwer&rewq 12364&23131@ 2. 概要设计 2.1主界面设计 回文判断的程序界面设计并不复杂,有提示字符串输入及结束符号的信息即可。运行界面如下图所示:

图2.1 2.2数据结构 本系统采用顺序栈结构类型(stack)存储用户输入的字符串以便判断是否为回文。 typedef struct { char elem[Stack_Size]; //用来存放栈中元素的一维数组 int top; //用来存放栈顶元素的下标 }SeqStack; 使用结构体,内部定义数组模拟栈。top为栈顶指针,指向当前元素的下一个位置。 3 模块设计 3.1模块设计: 本程序包含3个模块:主程序模块,判断模块,和顺序栈操作模块,调用关系如下: 主程序回文判断模块顺序栈操作模块 图2.2 3.2 功能模块的调用关系图

回文实验报告

实验题目 回文判断的算法 班级通信143 姓名刘峻霖学号2014101108 日期 2015年6月17日星期三

一、需求分析 1.程序的功能: 实现对字符序列是否是一个回文序列的判断 2.输入输出的要求: 从键盘读入一组字符序列,判断是否是回文,并将结果显示在屏幕上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.主程序的流程及各程序模块之间的层次关系。 (1)int InitStack(SqStack *S):栈初始化模块,即初始化一个空栈,随后对该空栈进行数据的写入操作; (2)int Push(SqStack *s, char data):入栈操作,即给空栈中写入数据,数据长度有宏定义给出; (3)int Pop(SqStack *s, char *data):出栈操作,即将栈中的数据输出,由于栈的操作是先进后出,因此,出栈的数据是原先输入数据的逆序; (4)int InitQueue(LinkQueue *q):队列初始化,即初始化一个空队列,最后对该空队列进行数据的写入操作; (5)int EnQueue(LinkQueue *q, char item):入队操作,即给空队列中写入数据,数据长度一样有宏定义给出; (6)int DeQueue(LinkQueue *q, char *item):出队操作,即将队列中的数据输出,由于队列的操作是先进先出,因此,出队的数据室原先输入数据的正序; (7)int main():主函数,用于调用前面的模块,进行出队数据与出栈数据的比较,判断输入的序列是否是回文序列。 模块之间关系及其相互调用的图示: 三、详细设计

数据结构课程设计回文数问题

湖南科技学院 课程设计报告 课程名称:数据结构课程设计 课程设计题目:02、回文问题 系: 专业: 年级、班: 姓名: 学号: 指导教师: 职称: 2011年12月

目录 1.问题描述 ----------------------------------------------------------------------3 2.具体要求 ----------------------------------------------------------------------3 3.测试数据 ----------------------------------------------------------------------3 4.算法思想 ----------------------------------------------------------------------3 5.模块划分 ----------------------------------------------------------------------4

6.数据结构 ----------------------------------------------------------------------4 7.源程序 ------------------------------------------------------------------------7 8.测试情况 --------------------------------------------------------------------14 9.设计总结 --------------------------------------------------------------------14 10.参考文献 --------------------------------------------------------------------15 一、问题描述

C++回文数的形成

C++回文数的形成 回文数的形成规则不知道数学上有没有证明。如果有的话,朋友可以告诉我,这里通过编程验证。 规则:任意的一个的十进制的整数,将其转过来后和原来的整数相加,得到新的整数后重复以上步骤,最终可以得到一个回文数。 #include #define MAX 2147483648 //限制M+N的范围 long re(long int a)//求输入整数的反序 { long int t; for(t=0;a>0;a/=10)//将整数反序 t=t*10+a%10; return t; } int nonre(long int s)//判断给定的整数是否为回文数 { if(re(s)==s) return 1;//是返回1 else return 0;//不是返回0 } void main() { long int n,m; int count=0; printf("please input a number optionaly:"); scanf("%ld",&n);

printf("The genetation process of palindrome:\n"); while(!nonre((m=re(n))+n))//判断整数与其反序相加后是否为回文数{ if((m+n)>=MAX)//超过界限输出提示信息 { printf("input error,break.\n"); break; } else { printf("[%d]:%ld+%ld=%ld\n",++count,n,m,m+n); n+=m;//累加 } } printf("[%d]:%d+%ld=%ld\n",++count,n,m+n); printf("Here we reached the aim at last.\n");//输出得到的回文数}

数据结构回文判断

数据结构回文判断 实验类型:验证型 【问题描述】 试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3 &3 -1’则不是。 思路: 首先建立一个字符数组,长度为100,然后向数组中写入索要判断的字符串。定义两个指针,一个指向队头,一个指向队尾,队头的指针不断递增,队尾的指针不断递减,在P1P2(字符串为奇数个)时,跳出并判断为回文;在这其中P1指针的值与P2指针的值有不等的情况就直接判定不是回文。 代码源: // huiwen.cpp : Defines the entry point for the console application. // #include #include

int main( void ) { char str[100]; printf("请输入字符串:"); gets( str ); //输入字符 char *p1 = str, *p2 = str + strlen(str) - 1;//指针定义 for( ; p1 < p2 && *p1 == *p2; ++p1, --p2 );//FOR循环体为空puts( p1 < p2 ? "所输字符串不是回文" : "所输字符串是回文" ); return 0; } 运行结果:

回文判断

实验报告

运行结果: 运行程序输入一段字符串,运行不同的结果如图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;

相关文档
最新文档