回文问题检测并输出一个文档中的回文单词要求用栈和队列实现.docx
- 文档编号:3973296
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:13
- 大小:62.29KB
回文问题检测并输出一个文档中的回文单词要求用栈和队列实现.docx
《回文问题检测并输出一个文档中的回文单词要求用栈和队列实现.docx》由会员分享,可在线阅读,更多相关《回文问题检测并输出一个文档中的回文单词要求用栈和队列实现.docx(13页珍藏版)》请在冰豆网上搜索。
回文问题检测并输出一个文档中的回文单词要求用栈和队列实现
湖南科技学院
课程设计报告
课程名称:
数据结构课程设计
课程设计题目:
回文检测
系:
数学与计算科学系
专业:
信息与计算科学
年级、班:
信计0801
姓名:
余丽
学号:
200805002126
指导教师:
牛志毅
职称:
讲师
2010年12月
目录
1.问题描述----------------------------------------------------------------------1
2.具体要求----------------------------------------------------------------------1
3.测试数据----------------------------------------------------------------------1
4.算法思想----------------------------------------------------------------------2
5.模块划分----------------------------------------------------------------------2
6.数据结构----------------------------------------------------------------------3
7.源程序------------------------------------------------------------------------3
8.测试情况--------------------------------------------------------------------7
9.总结体会--------------------------------------------------------------------9
10.参考文献--------------------------------------------------------------------12
一、问题描述
1.1课程设计题目:
回文问题----检测并输出一个文档中的回文单词(要求用栈和队列实现)。
1.2课程设计目的:
通过《数据结构》的学习,在课程设计中进一步理解和掌握所学的各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法,初步掌握软件开发过程的问题分析、设计、编码、测试等基本方法和基本技能。
将数据结构应用在具体的编程方面,更加了解课程所学习的内容及思维逻辑。
1.3课程设计意义:
利用数据结构课程设计,了解自己对《数据结构》的理解和加强自己对数据结构方面的应用知识,使自己掌握使用各种计算机资料和有关参考资料,提高自己进行程序设计的基本能力。
使自己能用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
1.4课程设计预期实现效果:
能实现简单的栈的操作,解决课程设计所要求的内容。
二、具体要求
课程设计要求将一个文档中单词进行检测并输出文档中的回文单词,要求程序有检测和输出功能,要求将整个文档中的每个单词都进行检测,并将每个文档中的回文单词输出。
编写一个程序来解决一个文档中单词的回文问题,该程序必须有判断一个单词是否是回文单词的功能,因此它应该有将文档分解成一个一个单词来进行判断并输出。
根据题目要求,还必须要用栈和队列来实现编写。
三、测试数据
创建一个名为yuli的文档,文档中分四次输入不同的以下数据:
1.Didannasayasannadid?
MaisasselflessasIam.Niagara,O,roaragain.Nolemons,nomelon.Nursesrun.Redrootputuptoorder.enanimalsIslaminanet.WasitaratIsaw?
King,areyougladyouareking?
Dollarsmakemencovetous,thencovetousmummakedollars.didabcbaana.
2.Fromthestorieswhicharaunfoldinginithenovel,thereadershouldknowthecharacteristicsofthedifferentkindsoflovevol,andshouldbeebablelbatodistinguishTrueLovefromtheotherkinds.
3.Trueloveirisiriacceeccaptance,committal,mutualandwithoutanypostconditions.ThelovebetweenLindaiyuandJiabaoyuisconsideredtotbeTrueLove.JustsayingorhearingIloveyouisnotgoodoogenoughbecausetalkischeap.Actioninmutualcommitmentisessential,aswecanseesinthenondood.
4.Wealways121454454havedreams.What'soursdream?
Doyouknowwhatyouexactlysnippinswant?
Anddoyouworkhardforit.Inthisbook,youcan8996998tastethefeelingoftheauthorabouthisstrongwill.Inhissooswords,youcanfindthecharmofChinese.Itisnotabook,butapreciousdeposits.Youcangetalotfromit.Butunfortunately,thenovelwassoccosnever"completed"tosuchastate.Ontheotherhand,maybe,itissnubbunsanothersoddoskindofbeautyofthebook.Ifyouhavenotreadthisbookyet,justgoandreadit.Youwilllovespattapsit.
四、算法思路
1)将文档中的单词读取到一个字符串中,取每个字符串的最后一个字符,如果不是字母或数字就删掉这个字符,字符串的长度减一。
2)调用入栈和入队列函数,将该字符串分别放入栈和队列中。
3)再根据栈的先进后出原理和队列的先进先出原理,将栈和队列中出来的字符串序列进行一一比较,若相等,则将标志flag设为true。
4)如果标志flag为true则该字符串为回文,并将回文单词输出。
五、模块划分
voidinitStack(SqStack&s);//初始化栈
voidpush(SqStack&s,char&e);//入栈
charpop(SqStack&s);//出栈
voidinitQueue(LinkQueue&q);//初始化队列
voidinsertElem(LinkQueue&q,chare);//在队列中插入元素
chardeleteElem(LinkQueue&q);//出队列元素
voidShowAbout();
六、数据结构
structSqStack{
charbase[MAXSIZE];
inttop;
};
structQNode{
chardata;
QNode*next;
};
structLinkQueue{
QNode*front;
QNode*rear;
};
voidinitStack(SqStack&s);//初始化栈
voidpush(SqStack&s,char&e);//入栈
charpop(SqStack&s);//出栈
voidinitQueue(LinkQueue&q);//初始化队列
voidinsertElem(LinkQueue&q,chare);//在队列中插入元素
chardeleteElem(LinkQueue&q);//出队列元素
voidShowAbout();
七、源程序
Main.cpp
#include
#include"fstream"
#include"string"
#include"jojo.h"
usingnamespacestd;
intmain()
{
boolflag=true;
stringstr1,str2;
LinkQueueq;//队列
SqStacks;//栈
initStack(s);//初始化栈
initQueue(q);//初始化队列
ShowAbout();
ifstreaminfile("a.txt");
while(!
infile.eof())//每次判断一个字符串是否是回文,直到文件读取完
{
flag=true;
infile>>str1;
if(str1[str1.length()-1]=='-')/*如果碰到连字符时,去掉连字符,并在str1后加上连字符后连续的字符串*/
{
str1.erase(str1.length()-1);//去掉连字符‘-’
infile>>str2;
str1+=str2;//将连字符两边的字符串连在一起
}
charc=str1[str1.length()-1];//读取的字符串最后一个字符赋给C
if(c>='0'&&c<='9'||c>='a'&&c<='z'||c>='A'&&c<='Z');
Else//当c是标点符号时就删除
str1.erase(str1.length()-1);
for(inti=0;i { push(s,str1[i]);//将读取的字符串入栈 insertElem(q,str1[i]);//将读取的字符串入队列 } intcount=str1.length();//得到读取的字符串长度 while(count) { if(pop(s)! =deleteElem(q))/*从队列和栈中读取一个节点,若也有一个不等,则不是回文,否则是回文,输出此回文*/ { flag=false; } count--; } if(flag&&infile.eof()==0) cout< } infile.close(); } Jojo.h #ifndefJOJO_H_INCLUDED #defineJOJO_H_INCLUDED #include usingnamespacestd; constintMAXSIZE=50; structSqStack{ charbase[MAXSIZE]; inttop; }; structQNode{ chardata; QNode*next; }; structLinkQueue{ QNode*front; QNode*rear; }; voidinitStack(SqStack&s); voidpush(SqStack&s,char&e); charpop(SqStack&s); voidinitQueue(LinkQueue&q); voidinsertElem(LinkQueue&q,chare); chardeleteElem(LinkQueue&q); voidShowAbout(); #endif//JOJO_H_INCLUDED Jojo.cpp #include"jojo.h" voidShowAbout() { cout<<"|****************************************|"< cout<<"*【回文测试】*"< cout<<"|****************************************|"< cout<<"*开发者: 余丽*"< cout<<"*学号: XXX*"< cout<<"*班级: 数学系信计0801班*"< cout<<"*2010.11.20*"< cout<<"|****************************************|"< } //⑴初始化栈 voidinitStack(SqStack&s){ s.top=0; } voidpush(SqStack&s,char&e){ if(s.top==MAXSIZE){ cerr<<"Stackoverflow! "< exit (1); } s.base[s.top]=e; ++s.top; } charpop(SqStack&s){//出栈 if(s.top==0){ cerr<<"Stackisempty! "< exit (1); } --s.top; chartemp=s.base[s.top]; returntemp; } voidinitQueue(LinkQueue&q){//队列 q.front=q.rear=newQNode; if(! q.front) exit (1); q.front->next=NULL; } voidinsertElem(LinkQueue&q,chare){ QNode*p=newQNode; p->data=e; p->next=NULL; q.rear->next=p; q.rear=p; } chardeleteElem(LinkQueue&q){ if(q.front==q.rear){ cerr<<"Queueisempty! "< exit (1); } QNode*p=q.front->next; chare=p->data; q.front->next=p->next; if(q.rear==p)//若链队为空,则需同时使队尾指针指向头结点 q.rear=q.front; deletep; returne; } 八、测试情况 文件1、Didannasayasannadid? MaisasselflessasIam.Niagara,O,roaragain.Nolemons,nomelon.Nursesrun.Redrootputuptoorder.enanimalsIslaminanet.WasitaratIsaw? King,areyougladyouareking? Dollarsmakemencovetous,thencovetousmummakedollars.didabcbaana. 文件2、Fromthestorieswhicharaunfoldinginithenovel,thereadershouldknowthecharacteristicsofthedifferentkindsoflovevol,andshouldbeebablelbatodistinguishTrueLovefromtheotherkinds. 文件3、Trueloveirisiriacceeccaptance,committal,mutualandwithoutanypostconditions.ThelovebetweenLindaiyuandJiabaoyuisconsideredtotbeTrueLove.JustsayingorhearingIloveyouisnotgoodoogenoughbecausetalkischeap.Actioninmutualcommitmentisessential,aswecanseesinthenondood. 文件4、Wealways121454454havedreams.What'soursdream? Doyouknowwhatyouexactlysnippinswant? Anddoyouworkhardforit.Inthisbook,youcan8996998tastethefeelingoftheauthorabouthisstrongwill.Inhissooswords,youcanfindthecharmofChinese.Itisnotabook,butapreciousdeposits.Youcangetalotfromit.Butunfortunately,thenovelwassoccosnever"completed"tosuchastate.Ontheotherhand,maybe,itissnubbunsanothersoddoskindofbeautyofthebook.Ifyouhavenotreadthisbookyet,justgoandreadit.Youwilllovespattapsit. 九、总结体会 通过做这次课程设计,我发现了自己知识学的不够扎实,知识还存在很多漏洞,也明白了知识需要实践,特别是c、数据结构等课程需要上机实践,但同时我也在做课程设计的时候,通过查阅书籍、上网查资料和在c++群中与很多专业相同的人进行探讨,发现了编程的乐趣,虽然只用栈做本题,但我觉得做题的过程是快乐的,知道了如何主动学习一些语言。 刚开始做题的时候我毫无头绪,查完回文的定义后,看完课件也是照抄不误的把东西搬去执行,看到头文件、源文件和主函数共一两百行的函数却还是无法将东西实现时,甚至有点想放弃了,但后来冷静下来分析后,我觉得不能就此放弃,然后通过网络这个优势,知道了这个东西可以查很多有用的东西,并加了一个c++群,在里面和他们一起探讨,知道了stack可以作为头文件,这就大大缩减了我的程序,慢慢的对栈的一些操作也就越来越熟悉,并想到了可以通过正序入栈和逆序入栈来比较,刚开始的程序设计为: #include #include #include #include usingnamespacestd; intmain() { stack ifstreammyfile("yuli.txt");//打开文件yuli.txt stringstr,temp;//定义两个字符串 boolflag=true;//定义一个标志 cout<<"文档中的回文单词有: "< while(! myfile.eof())//判断文档中还有数据 { flag=true; myfile>>str;//读取数据到str中 if(str[str.length()-1]=='-')//若遇到连字符号 { str.erase(str.length()-1);//删除连字符号 myfile>>temp;//继读取下一个字符串到temp中 str+=temp;//将连字符号前后的字符串合并为一个字符串 } charc=str[str.length()-1];//判断字符串的最后一个字符 if(c>='0'&&c<='9'||c>='a'&&c<='z'||c>='A'&&c<='Z');//若最后一个字符为字母或数字则什么也不做 else//最后一个字符为标点符号 str.erase(str.length()-1);//删除该标点符号 for(inti=0;i { s1.push(str[i]); } for(inti=str.length()-1;i>=0;i--)//将字符串逆序入栈 { s2.push(str[i]); } intcount=str.length(); while(count)//栈不为空 { if(s1.top()! =s2.top())//如果两个栈的顶点字符不相等 { flag=false;//标志设为false } s1.pop();//栈s1顶部下移一个位置 s2.pop();//栈s2顶部下移一个位置 count--; } if(flag)//标志为true该字符串是回文 cout< } myfile.close();//关闭文件 } 做完后还觉得蛮有成就感的,可后来觉得这个很短,不好做课程设计,于是又看书充电,问班上的同学,主函数大致不变,只是把#include 一十、参考文献 ⑴严蔚敏,吴伟民.数据结构.清华大学出版社,2007.4 ⑵钱能.C++程序设计教程(第二版).清华大学出版社,2005.9
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 回文 问题 检测 输出 一个 文档 中的 单词 要求 队列 实现