中心对称字符串问题.docx
- 文档编号:7083479
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:16
- 大小:103.80KB
中心对称字符串问题.docx
《中心对称字符串问题.docx》由会员分享,可在线阅读,更多相关《中心对称字符串问题.docx(16页珍藏版)》请在冰豆网上搜索。
中心对称字符串问题
课程设计
题目:
中心对称字符串问题
作者:
学号:
所属院(系):
专业年级:
指导老师:
职称:
时间:
2011年6月28日
目录
需求分析-----------------------------------
概要设计-----------------------------------
抽象收据定义-------------------------------
详细设计-----------------------------------
测试调试-----------------------------------
总结---------------------------------------
参考文献-----------------------------------
一、需求分析
1、应用环境设定
(1)问题描述
有n个字符的字符串,用c或c++语言编写程序判断该字符串是否中心对称。
例如,abbccdccbba与abba都是中心对称的字符串。
(2)要求
采用单链表数据结构或栈数据结构的方法实现上述问题的求解。
如果采用两种或两种以上数据结构实现者,可加分。
系统编程中使用的工具主要有PC机上的编程工具,业务系统是基于Windows7上开发的,开发工具选择的是MicrosoftVisualStudioSP6。
2、程序的用户界面
命令行界面
按照一定规律输入字符串,然后开始检验字符串
3、输入方式
字符数
输入字符串
4、输出方式
输出判定结果
字符串中心对称
字符串中心不对称
5、数据存储方式
全部在内存存放,不使用硬盘上的文件或其他数据源,程序执行过程中和结束后不保存数据。
6、程序功能
判定是否为对称字符串
二、概要设计
单链表数据结构:
用链表存储字符串,将链表前半部分倒置与后半部分比较。
单链表和栈数据结构:
用单链表存储字符串,将字符串前半部分进栈、出栈行成新的链表和原来有链表比较。
三、抽象数据定义
单链表数据结构
typedefstructlinknode{
chardata;
structlinknode*next;
}point;
创建链表,将链表前半部分倒置
在前半部分行程的新链表和后半部分链表逐个比较元素比较
单链表和栈
数据抽象
typedefstructnode
{
chardata;
structnode*next;
}LinkList;
typedefstruct
{
char*base;//栈顶指针(始终指向栈顶元素的下一个位置)
char*top;//栈底指针(始终指向栈底)
}stack;
LinkList* create(char s[])
构造单链表
void InitStack(stack &s)
构造空栈
void push(stack &s,char e)
进栈,将字符串前半部分进栈
char pop(stack &s,char &e)
出栈,弹出字符进行比较
int judge(LinkList *head)
判断单链表是否对称
四、详细设计
A)单链表数据结构
流程图
主要功能模块
抽象数据定义指针
typedefstructlinknode{
chardata;
structlinknode*next;
}point;
输入字符数、字符串
inti,n=0;
point*f,*p,*q,*h,*s;
cout<<"Inputthenumberofcharacterstring:
";
cin>>n;
cout< "; p=(point*)malloc(sizeof(point)); q=p; 前半部分字符串倒置 for(i=1;i<=n-1;i++){ q->next=(point*)malloc(sizeof(point)); q=q->next; } cin>>q->data; q->next=NULL; f=p; p=NULL; i=0; s=f; while(i<(n/2)){ q=s; s=s->next; q->next=p; p=q; i++; } 字符串为奇数,忽略中间数 if(n%2==1) p=p->next; else q=s; h=p; 逐个比较元素值 while((p! =NULL)&&(q! =NULL)&&(p->data==q->data)) { p=p->next; q=q->next; } 得到判断结果 if((p==NULL)&&(q==NULL)) cout<<"中心对称! "; else cout<<"中心不对称! "; } A)调试测试 B)栈的数据结构 流程图 主要功能设计 定义单链表的结点类型 typedefstructnode { chardata; structnode*next; }LinkList; 根据输入的字符(存储在字数组中)建立一个不带结点的单链表 LinkList*create(chars[]) { LinkList*head, *newNode,//newNode *tail;//tail for(inti=0;s[i]! ='\0';i++) { newNode=(LinkList*)malloc(sizeof(LinkList));//新开一个结点 newNode->data=s[i]; newNode->next=NULL; if(i==0)//如果只输入了一个字符 { head=newNode; tail=head; } else { tail->next=newNode;//把新开的结点连接到链表的最后一个结点上 tail=newNode; } } returnhead; } 定义栈的存储类型 typedefstruct { char*base; char*top; }stack; voidInitStack(stack&s)//栈的初始化 { s.base=(char*)malloc(max*sizeof(char)); s.top=s.base; } voidpush(stack&s,chare)//进栈函数 { *s.top++=e; } charpop(stack&s,char&e)//出栈函数 { e=*--s.top; returne; } 判断以单链表存储的字符串是否对称的函数 intjudge(LinkList*head) { stacks; chare; InitStack(s);//定义一个栈并初始化 LinkList*p=head;//把头指针赋给p,即让p指向第一个结点 while(p! =NULL) { push(s,p->data); p=p->next; } p=head; while(p! =NULL)//将栈中的元素弹出,逐个与链表中的元素比较(可以看成是把链表换个方向,然后与原来的链表比较) switch(judge(create(str)))//根据输入的字符串(存储在字符数组中)建立单链表然后进行判断 B)调试测试 五、总结: 更深沉次的了解数据结构,是一次比较好的集中训练。 但是写代码之前先做好分析准备能够提高写代码的效率,写代码时回头看分析也能找出分析的不足。 主要收获: (1)保持良好的学习心态,第一,要有自信,自强,积极主动学习.第二,克服畏难情绪,树立学好程序设计的信心 (2)要了解概念: VB程序设计本身并不复杂,变量,函数,条件语句,循环语句等概念较多.要真正能进行程序设计,就要深入理解这些概念.应该重视概念的学习. (3)自己动手编写程序,亲自动手进行程序设计是培养逻辑思维的好方法.因此我们得多动手编写程序,逐渐提高写程序的能力.自己动手,编写一些程序,才会有成就感,进而对课程产生兴趣,做起来才比较从容.等你在编写大量程序之后(4)上机调试程序应注意多问问同学,多问问老师、,把不懂的地方标出来。 (5)养成良好的编程习惯,第一,程序构思要有说明;第二,学会如何调试程序;第三,对运行结果要做正确与否的分析。 参考文献: 《数据结构》、《C语言程序设计》 代码如下: 单链表 #include #include #include #include typedefstructlinknode{ chardata; structlinknode*next; }point; intmain() { inti,n=0; point*f,*p,*q,*h,*s; cout<<"Inputthenumberofcharacterstring: "; cin>>n; cout< "; p=(point*)malloc(sizeof(point)); q=p; for(i=1;i<=n-1;i++){ q->next=(point*)malloc(sizeof(point)); q=q->next; } cin>>q->data; q->next=NULL; f=p;//f为指向字符串单链表的头指针 p=NULL; i=0; s=f; while(i<(n/2)){//前半部分倒置 q=s; s=s->next; q->next=p; p=q; i++; } if(n%2==1) p=p->next; else q=s; h=p; while((p! =NULL)&&(q! =NULL)&&(p->data==q->data))//逐个比较元素值 { p=p->next; q=q->next; } if((p==NULL)&&(q==NULL))//得到判断结果 cout<<"中心对称! "; else cout<<"中心不对称! "; } 单链表和栈数据结构 #include #include #include #definemax100 //////////////////定义单链表的结点类型//////////////////// typedefstructnode { chardata; structnode*next; }LinkList; /////////////////根据输入的字符(存储在字数组中)建立一个不带结点的单链表///////////// LinkList*create(chars[])//函数返回的类型为指针 { LinkList*head,//头指针 *newNode,//newNode始终指向新开的结点 *tail;//tail始终指向链表中的最后一个结点 for(inti=0;s[i]! ='\0';i++) { newNode=(LinkList*)malloc(sizeof(LinkList));//新开一个结点 newNode->data=s[i]; newNode->next=NULL; if(i==0)//如果只输入了一个字符 { head=newNode; tail=head; } else { tail->next=newNode;//把新开的结点连接到链表的最后一个结点上 tail=newNode; } } returnhead; } ////////////////////定义栈的存储类型////////////////////////// typedefstruct { char*base;//栈顶指针(始终指向栈顶元素的下一个位置) char*top;//栈底指针(始终指向栈底) }stack; voidInitStack(stack&s)//栈的初始化 { s.base=(char*)malloc(max*sizeof(char)); s.top=s.base; } voidpush(stack&s,chare)//进栈函数 { *s.top++=e; } charpop(stack&s,char&e)//出栈函数 { e=*--s.top; returne; } ///////////////判断以单链表存储的字符串是否对称的函数//////////////// intjudge(LinkList*head) { stacks; chare; InitStack(s);//定义一个栈并初始化 LinkList*p=head;//把头指针赋给p,即让p指向第一个结点 while(p! =NULL) { push(s,p->data); p=p->next; } p=head; while(p! =NULL)//将栈中的元素弹出,逐个与链表中的元素比较(可以看成是把链表换个方向,然后与原来的链表比较) { if(p->data==pop(s,e)) p=p->next; else break;//如果不相等,说明不是对称,调处循环 } if(p==NULL)return1; elsereturn0; } voidmain() { charstr[max];//定义一个字符数组,用来存储输入的字符 LinkList*h; while (1) { printf("\n\n请输入字符串(输入cls清屏,exit退出): "); gets(str); if(strcmp(str,"exit")==0)break; if(strcmp(str,"cls")==0)system("cls"); switch(judge(create(str)))//根据输入的字符串(存储在字符数组中)建立单链表然后进行判断 { case1: printf("\n%s是中心对称的的字符串\n",str); break; case0: printf("\n%s不是关于中心对称的\n",str); break; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中心对称 字符串 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)