回文串实验报告
课程名称:数据结构
实验名称:单链表
学生姓名:杜克强
学生学号: 201207092427
实验一回文串的基本操作及其应用
一、实验目的
1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。
2、掌握栈和队列的特点,即后进先出和先进先出的原则。
3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序
存储结构和链式存储结构上的实现。
二、实验内容和要求
[问题描述]
对于一个从键盘输入的字符串,判断其是否为回文。回文即正反序相同。如“abba”是回文,而“abab”不是回文。
[基本要求]
(1)数据从键盘读入;
(2)输出要判断的字符串;
(3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。
[测试数据]
由学生任意指定。
三、实验步骤
1.需求分析
本演示程序用C语言编写,完成对一个字符串是否是回文字符串的判断
①输入一个任意的字符串;
②对输入的字符串进行判断是否为回文串;
③输出判断结果;
④测试数据:
A.依次输入“abccba”,“asddas”等数据;
B.输出判断结果“Yes”,“No”等
四、算法设计
1、算法思想:
把字符串中的字符逐个分别存储到队列和堆栈中,然后逐个出队和出栈并比较出队列的数据元素和退栈的数据元素是否相等,若相等则是会文,否则不是。
2、模块设计
(1)int Palindrome_Test()判断字符序列是否为回文串;
(2)Status main()主函数;
(3)Status CreatStack(SqStack &S)创建一个栈;
(4)Status Push(SqStack &S,SElemType e)入栈;
(5)Status Pop(SqStack &S ,SElemType &e)出栈;
(6)Status CreatQueue(LinkQueue &Q)创建一个队列;
(7)Status EnQueue(LinkQueue &Q,QElemType e)入队;
(8)Status DeQueue(LinkQueue &Q,QElemType &e)出队;
3、模块之间关系及其相互调用的图示
4、数据存储结构图
五、调试分析
一、实验结果
图2 实验结果
二、总结
通过做回文串实验让我同时用到了栈和队列两种结构,让我对这两种结构有了一个比较深入的了解和应用,对我以后的编程产生了比较深远的影响。
源程序(带注释)
//创建栈
Status CreatStack(SqStack &S){
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
//创建队列
tatus CreatQueue(LinkQueue &Q){
//建立一个空的链式栈
Q.front=Q.rear=(QNodePtr)malloc(sizeof(QNode));
if(!Q.front)exit(OVERFLOW);
Q.front->next=NULL;
return OK;
}
//入栈
Status Push(SqStack &S,SElemType e){
if(S.top-S.base>=S.stacksize){//栈满,追加存储空间
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElem Type));
if(!S.base)exit (OVERFLOW);//存储空间分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
//入队
Status EnQueue(LinkQueue &Q,QElemType e)
{
QNodePtr p;
p=(QNodePtr)malloc(sizeof(QNode));
if(!p)exit(OVERFLOW);
p->data=e;p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return OK;
}
//出栈
Status Pop(SqStack &S ,SElemType &e){
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
//出队
Status DeQueue(LinkQueue &Q,QElemType &e)
{
QNodePtr p;
if(Q.front==Q.rear) return ERROR;
p=Q.front->next; e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return OK;
}
//判断是否为回文串
int Palindrome_Test()//判别输入的字符串是否回文序列,是则返回1,否则返回0 {
SqStack S;
LinkQueue Q;
CreatStack(S);
CreatQueue(Q);
char c;
SElemType a,b;
while((c=getchar())!='@')
{
Push(S,c);EnQueue(Q,c); //同时使用栈和队列两种结构
}
while(S.top!=S.base)
{
Pop(S,a);DeQueue(Q,b);
if(a!=b) return ERROR;
}
return OK;
}
(注:范文素材和资料部分来自网络,供参考。请预览后才下载,期待你的好评与关注。)