数据结构课程设计回文数问题.doc_第1页
数据结构课程设计回文数问题.doc_第2页
数据结构课程设计回文数问题.doc_第3页
数据结构课程设计回文数问题.doc_第4页
数据结构课程设计回文数问题.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

湖南科技学院课程设计报告课程名称:数据结构课程设计课程设计题目: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 baseMAXSIZE; int top;定义队列:struct QNode /定义队列结点 char data; QNode* next;struct LinkQueue/ 定义队列 QNode* front; QNode* rear;图示:栈图示:队列,插入元素抽象数据类型栈定义如下ADT stack数据对象:D=|i=1,2,n,n0数据关系:R1=|,D,i=2,n; 约定端为栈顶,端为栈底基本操作: 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=|i=1,2,n,n0数据关系:R1=|,D,i=2,n; 约定端为队列尾,端为队列头基本操作: initQueue(&q); 操作结果:构造一个空队列q isEmpty(q) 初始条件:队列q存在 操作结果:判断队列是否为空,为空返回true,否则返回false destroyQueue(&q) 初始条件:队列q存在 操作结果:销毁队列q insertElem(&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 baseMAXSIZE; 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#include#include#includeSqStack.husing 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) cerrStack overflow!endl; exit(1); s.bases.top=e; +s.top;char pop(SqStack& s)/若栈不空,则删除s的栈顶元素(出栈) if (s.top=0) cerrStack is empty!endl; exit(1); -s.top; char temp=s.bases.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#include#include#includeLinkQueue.husing 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) cerrQueue is empty!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#include#include#include#includeSqStack.h#includeLinkQueue.husing 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*文本文件中回文单词如下*str; i=str.length(); char c=stri-1; if (c=a|c=A|c=Z); else i-; for (int j=0; ji; j+) push(s,strj); insertElem(q,strj); for (int k=0; ki; k+) if (pop(s)=deleteElem(q) count+; if (count=i&infile.eof()=0) for (int n=0; ni; n+) coutstrn; cout ; sum+; infile.close(); coutendl; cout此文本文档中共有回文单词:sum个 endl; cout*endl; clearStack(s); if(isEmpty(s) cout栈销毁成功!endl; destroyQueue(q); if(isEmpty(q); cout队列销毁成功!endl; return 0;八、测试情况测试结果分析对于语句中的一般回文单词能正常输出,句末跟标点符号连在一起的回文单词也能通过程序把字符串末尾的标点给去掉并正常输出,而字符串中的连接符可以作为回文单词的组成部分一起输出。九、设计总结本次课程设计我本来打算做第一个的,后来还是不得不做第二个,但最后我还是将第一个和第二个一起做了,我觉得回文数检查太简单,所以也没有花多大功夫去做,只是利用了栈和队列的性质,将字符压入栈与队列中,然后压出,判断是否相等,相等就输出。设计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论