回文判断的算法实验报告.docx
《回文判断的算法实验报告.docx》由会员分享,可在线阅读,更多相关《回文判断的算法实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
![回文判断的算法实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/12/9fb1650e-9bef-46c5-a548-9c4701f5e004/9fb1650e-9bef-46c5-a548-9c4701f5e0041.gif)
回文判断的算法实验报告
实验题目
回文判断的算法
一、需求分析
1.程序的功能:
实现对字符序列是否是一个回文序列的判断
2.输入输出的要求:
从键盘读入一组字符序列,判断是否是回文,并将结果显示在屏幕上
3.测试数据:
回文字符序列输入:
非回文字符序列输入:
二、概要设计
1.本程序所用的抽象数据类型的定义:
typedefstruct{
charitem[STACKSIZE];
inttop;
}SqStack;
typedefstructQNode{
chardata;
structQNode*next;
}LQNode,*PQNode;
typedefstruct{
PQNodefront,rear;
}LinkQueue;
2.主程序的流程及各程序模块之间的层次关系。
(1)intInitStack(SqStack*S):
栈初始化模块,即初始化一个空栈,随后对该空栈进行数据的写入操作;
(2)intPush(SqStack*s,chardata):
入栈操作,即给空栈中写入数据,数据长度有宏定义给出;
(3)intPop(SqStack*s,char*data):
出栈操作,即将栈中的数据输出,由于栈的操作是先进后出,因此,出栈的数据是原先输入数据的逆序;
(4)intInitQueue(LinkQueue*q):
队列初始化,即初始化一个空队列,最后对该空队列进行数据的写入操作;
(5)intEnQueue(LinkQueue*q,charitem):
入队操作,即给空队列中写入数据,数据长度一样有宏定义给出;
(6)intDeQueue(LinkQueue*q,char*item):
出队操作,即将队列中的数据输出,由于队列的操作是先进先出,因此,出队的数据室原先输入数据的正序;
(7)intmain():
主函数,用于调用前面的模块,进行出队数据与出栈数据的比较,判断输入的序列是否是回文序列。
模块之间关系及其相互调用的图示:
三、详细设计
1.采用c语言定义相关的数据类型
整形,字符型,指针类型,聚合类型,自定义类型
2.写出各模块的伪码算法:
参照源程序
(1)intInitStack(SqStack*S)
(2)intPush(SqStack*s,chardata)
(3)intPop(SqStack*s,char*data)
(4)intInitQueue(LinkQueue*q)
(5)intEnQueue(LinkQueue*q,charitem)
(6)intDeQueue(LinkQueue*q,char*item)
四、调试分析
1.调试中遇到的问题及对问题的解决方法:
问题:
程序出现未知错误。
方法:
在感觉容易出错的地方或者是已经出错的地方前面打断点,进一步调试。
2.算法的时间复杂度和空间复杂度。
时间复杂度:
T(n)=O(n)
五、使用说明及测试结果
回文字符输入:
非回文字符输入:
六、源程序(带注释)
#include
#include
#include
#defineSTACKSIZE100
typedefstruct{
charitem[STACKSIZE];
inttop;
}SqStack;/*顺序栈的定义*/
typedefstructQNode{
chardata;
structQNode*next;
}LQNode,*PQNode;
typedefstruct{
PQNodefront,rear;
}LinkQueue;/*链队列的定义*/
intInitStack(SqStack*S);/*初始化顺序栈*/
intStackEmpty(SqStackS);/*判断是否为空栈*/
intPush(SqStack*s,chardata);/*入栈*/
intPop(SqStack*s,char*data);/*出栈*/
intInitQueue(LinkQueue*q);/*初始化链队列*/
intQueueEmpty(LinkQueueq);/*判断是否为空队列*/
intEnQueue(LinkQueue*q,charitem);/*入队*/
intDeQueue(LinkQueue*q,char*item);/*出队*/
intTraverseQueue(LinkQueueq);/*遍历*/
intInitStack(SqStack*S)/*初始化顺序栈*/
{
S->top=-1;
return1;
}
intStackEmpty(SqStackS)/*判断是否为空栈*/
{
if(S.top==-1)return1;
elsereturn0;
}
intPush(SqStack*s,chardata)/*入栈*/
{
if(s->top==STACKSIZE-1)
{
printf("\n栈已满,不能完成入栈操作!
");
return0;
}
s->top++;
s->item[s->top]=data;
return1;
}
intPop(SqStack*s,char*data)/*出栈*/
{
if(s->top==-1)
{
printf("\n堆栈已空,不能完成出栈操作!
");
return0;
}
*data=s->item[s->top];
s->top--;
return1;
}
intInitQueue(LinkQueue*q)/*初始化链队列*/
{
q->front=q->rear=(PQNode)malloc(sizeof(LQNode));
if(!
q->front)
{
printf("\n初始化队列失败!
");
return0;
}
q->front->next=NULL;
return1;
}
intQueueEmpty(LinkQueueq)/*判断是否为空队列*/
{
if(q.front==q.rear)
{
printf("\n队列为空!
");
return1;
}
elsereturn0;
}
intEnQueue(LinkQueue*q,charitem)/*入队*/
{
PQNodep;
p=(PQNode)malloc(sizeof(LQNode));
if(!
p)
{
printf("\n内存分配失败");
return0;
}
p->data=item;
p->next=NULL;
q->rear->next=p;
q->rear=p;
return1;
}
intDeQueue(LinkQueue*q,char*item)/*出队*/
{
PQNodep;
if(q->front==q->rear)
{
printf("\n队列已空,不能出队");
return0;
}
p=q->front->next;
*item=p->data;
q->front->next=p->next;
free(p);
if(q->rear==p)/*若删除的为最后一个结点,移动队尾指针*/
q->front=q->rear;
return1;
}
intTraverseQueue(LinkQueueq)/*遍历*/
{
PQNodepos;
if(q.front==q.rear)
{
printf("\n队列为空!
");
return0;
}
pos=q.front->next;
printf("\nHereisthestring:
");
while(pos!
=NULL)
{
printf("%c",pos->data);
pos=pos->next;
}
printf("\n");
return1;
}
intmain()
{
inti,len,count1=0;
charstr1[100],ch,ch1;
LinkQueuelq1,lq2;
SqStacksq;
printf("请输入字符:
");
scanf("%s",&str1);
len=strlen(str1);
InitQueue(&lq1);
InitQueue(&lq2);
InitStack(&sq);
for(i=0;i{
EnQueue(&lq1,str1[i]);
}
TraverseQueue(lq1);
for(i=0;i{
DeQueue(&lq1,&ch);
Push(&sq,ch);
EnQueue(&lq1,ch);
}
for(i=0;i{
Pop(&sq,&ch);
EnQueue(&lq2,ch);
}
TraverseQueue(lq2);
for(i=0;i{
DeQueue(&lq1,&ch);
DeQueue(&lq2,&ch1);
if(ch1!
=ch)count1++;
}
if(count1==0)
{
printf("\n该字符串为回文");
}
else
printf("\n该字符串不是回文");
return0;
}