当前位置:文档之家› 数据结构课程设计回文数问题

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

湖南科技学院课程设计报告课程名称:数据结构课程设计课程设计题目: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 base[MAXSIZE];int top;};定义队列:struct QNode //定义队列结点{char data;QNode* next;};struct LinkQueue// 定义队列{QNode* front;QNode* rear;};图示:栈图示:队列,插入元素抽象数据类型栈定义如下ADT stack{数据对象:D={ai|ai,∈i=1,2,……,n,n≥0}ElenSet数据关系:R1={<1-i a ,ai >|1-i a ,ai ∈D,i=2,……n};约定n a 端为栈顶,1a 端为栈底基本操作: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={ai |ai ,ElenSet ∈i=1,2,……,n,n ≥0}数据关系:R1={<1-i a ,ai >|1-i a ,ai ∈D,i=2,……n};约定n a 端为队列尾,1a 端为队列头基本操作:initQueue(&q);操作结果:构造一个空队列qisEmpty(q)初始条件:队列q存在操作结果:判断队列是否为空,为空返回true,否则返回false destroyQueue(&q)初始条件:队列q存在操作结果:销毁队列qinsertElem(&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 base[MAXSIZE];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<iostream>#include<cstring>#include<cstdlib>#include"SqStack.h"using 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){cerr<<"Stack overflow!"<<endl;exit(1);}s.base[s.top]=e;++s.top;}char pop(SqStack& s)//若栈不空,则删除s的栈顶元素(出栈){if (s.top==0){cerr<<"Stack is empty!"<<endl;exit(1);}--s.top;char temp=s.base[s.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<iostream>#include<cstring>#include<cstdlib>#include"LinkQueue.h"using 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){cerr<<"Queue is empty!"<<endl;exit(1);}QNode* p=q.front->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<iostream>#include<cstring>#include<fstream>#include<cstdlib>#include"SqStack.h"#include"LinkQueue.h"using 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<<"**************文本文件中回文单词如下***************"<<endl;while (infile.eof()==0){int count=0;infile>>str;i=str.length();char c=str[i-1];if (c>='a'||c<='z'||c>='A'||c<='Z');elsei--;for (int j=0; j<i; j++){push(s,str[j]);insertElem(q,str[j]);}for (int k=0; k<i; k++)if (pop(s)==deleteElem(q))count++;if (count==i&&infile.eof()==0){for (int n=0; n<i; n++)cout<<str[n];cout<<" ";sum++;}}infile.close();cout<<endl;cout<<"此文本文档中共有回文单词:"<<sum<<"个" <<endl; cout<<"****************************************"<<endl; clearStack(s);if(isEmpty(s)){cout<<"栈销毁成功!"<<endl;}destroyQueue(q);if(isEmpty(q));{cout<<"队列销毁成功!"<<endl;}return 0;}八、测试情况测试结果分析对于语句中的一般回文单词能正常输出,句末跟标点符号连在一起的回文单词也能通过程序把字符串末尾的标点给去掉并正常输出,而字符串中的连接符可以作为回文单词的组成部分一起输出。

相关主题