回文判断实验二
- 格式:doc
- 大小:47.50 KB
- 文档页数:7
回文判断实验报告一(实验题目:回文判断二(实验目的:对于一个从键盘输入的字符串,判断其是否为回文。
回文即正反序相同。
如“abba”是回文,而“abab”不是回文。
三(实验需求:1.数据从键盘读入;2.输出要判断的字符串;3.利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”否则输出“No”四(主要实现函数(1)建立顺序栈存储结构typedef struct { }(2)初始化int initstack(Sqstack &s,int maxsize)(3)入栈int enstack(Sqstack &s, char e) (4)出栈int popstack(Sqstack &s,char &e)(5)判断是否为回文int main(){int r; //用于判断是否为回文Sqstack L,Q; //定义两个栈initstack(L,20);initstack(Q,20);int l; //用于记录输入字符的长度 cout<<"请输入字符串长度"; cin>>l;if(l<=0)exit(1);cout<<"输入字符"<<endl;for(int i=1;i<=l;i++) //输入字符 {char p;cin>>p;enstack(L,p); //入栈 L }cout<<endl;for(int m=1;m<=l;m++){char f;f=getstack(L,m); //从栈 L中取元素,在入栈 Qenstack(Q,f);}for(int n=1;n<=l;n++){char a,b; //从栈 L Q 出栈,比较popstack(L,a);popstack(Q,b);if(a!=b)r=1;else r=2;}if(r==1)cout<<"no"<<endl<<endl;五(源程序#include <iostream> using namespace std; typedef char SElemType; typedef struct {SElemType *base;SElemType *top;int stacksize;}Sqstack;int initstack(Sqstack &s,int maxsize) /{s.base=new SElemType[maxsize]; if(!s.base)exit(1);s.top=s.base;s.stacksize=maxsize;return 0;}int enstack(Sqstack &s, char e){if(s.top-s.base==s.stacksize)exit(1); *s.top=e;s.top++;return 0;}int popstack(Sqstack &s,char &e){if(s.top==s.base)exit(1);e=*--s.top;return 0;}int getstack(Sqstack &s,int i) { SElemType *p;p=s.top;for(int j=1;j<=i;j++){p--;}return *p;}int main(){int r; Sqstack L,Q; initstack(L,20); initstack(Q,20);int l; cout<<"请输入字符串长度"; cin>>l;if(l<=0)exit(1);cout<<"输入字符"<<endl;for(int i=1;i<=l;i++) {char p;cin>>p;enstack(L,p); }cout<<endl;for(int m=1;m<=l;m++){char f;f=getstack(L,m);enstack(Q,f);}for(int n=1;n<=l;n++){char a,b;popstack(L,a);popstack(Q,b);if(a!=b)r=1;else r=2;}if(r==1)cout<<"no"<<endl<<endl; else if(r==2)cout<<"yes"<<endl<<endl; else cout<<"发生错误"<<endl;cout<<"继续判断输入Y,退出输入N"<<endl;char d;cin>>d;if(d=='y'||d=='Y')main();else return 0;}五(各功能的运行界面:(1)主界面:(2)输入1,2,3,4四个字符判断是否是回文,运行界面如下:(3)设置字符串长度为5,a,s,d,s,a,判断是否为回文,运行界面如下:。
数据结构回文实验报告数据结构回文实验报告引言:数据结构是计算机科学中的重要概念,它研究如何组织和管理数据,以便高效地访问和操作。
回文是一种特殊的字符串,它正着读和倒着读都一样。
在本实验中,我们将探索使用不同的数据结构来判断一个字符串是否为回文。
实验目的:1. 了解回文的概念和特点;2. 掌握常见的数据结构,如数组、链表和栈;3. 实践使用不同数据结构来判断字符串是否为回文;4. 比较不同数据结构在回文判断中的性能差异。
实验过程:首先,我们需要定义一个字符串,并将其存储在不同的数据结构中。
我们选择了“level”这个回文字符串作为示例。
1. 数组:我们使用一个字符数组来存储字符串。
首先,我们需要计算字符串的长度,并将每个字符按顺序存储在数组中。
然后,我们使用两个指针,一个指向数组的开头,一个指向数组的末尾,逐个比较它们所指向的字符是否相同。
如果所有字符都相同,则该字符串是回文。
2. 链表:我们使用一个单向链表来存储字符串。
每个节点包含一个字符和一个指向下一个节点的指针。
我们将字符串的每个字符依次插入链表的末尾。
然后,我们使用两个指针,一个指向链表的开头,一个指向链表的末尾,逐个比较它们所指向的字符是否相同。
如果所有字符都相同,则该字符串是回文。
3. 栈:我们使用一个栈来存储字符串。
我们将字符串的每个字符依次入栈。
然后,我们使用两个指针,一个指向栈的顶部,一个指向栈的底部,逐个比较它们所指向的字符是否相同。
如果所有字符都相同,则该字符串是回文。
实验结果:我们对以上三种数据结构进行了回文判断实验,并记录了结果。
在本次实验中,我们发现使用数组和栈的方法可以正确判断字符串是否为回文,而使用链表的方法则无法正确判断。
这是因为链表无法像数组和栈一样快速访问和比较元素。
性能比较:我们进一步比较了使用数组和栈的方法在回文判断中的性能差异。
我们使用了不同长度的字符串进行实验,并记录了执行时间。
实验结果显示,数组的执行时间与字符串长度成正比,而栈的执行时间与字符串长度无关。
设计题目<二>: 3.4.4回文判断P591.设计要求1.1问题描述试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如“序列1&序列2”模式的字符序列。
其中序列1和序列2中都不含字符“&”,且序列2是序列1的逆序列。
例如:“a+b&b+a”是属该模式的字符序列,而“1+3&3-1”则不是。
1.2需求分析这是一个利用栈结构完成的程序。
为了实现算术优先算法,我们使用两个工作栈,一个称为操作符栈(OPTR),用以寄存运算符;一个称为操作数栈(OPND),用以寄存操作数或运算结果。
算法的基本思想是:(1)输入测试数据组数,接着分组输入字符串,以@结尾。
(2)输入序列总长不超过(MAX_N = 10005)/2个。
将序列1先入栈,接着处理序列2,同时出栈判断。
(3)将序列1全部入栈,接着输入序列2,同时出栈判断。
(4)如果序列满足题目要求,则输出“回文序列”;否则,输出“非回文序列”。
(5)测试数据:qwer&rewq@qwerrewq@qwer&rewq12364&23131@2. 概要设计2.1主界面设计回文判断的程序界面设计并不复杂,有提示字符串输入及结束符号的信息即可。
运行界面如下图所示:图2.12.2数据结构本系统采用顺序栈结构类型(stack)存储用户输入的字符串以便判断是否为回文。
typedef struct{char elem[Stack_Size]; //用来存放栈中元素的一维数组int top; //用来存放栈顶元素的下标}SeqStack; 使用结构体,内部定义数组模拟栈。
top为栈顶指针,指向当前元素的下一个位置。
3 模块设计3.1模块设计:本程序包含3个模块:主程序模块,判断模块,和顺序栈操作模块,调用关系如下:主程序回文判断模块顺序栈操作模块图2.23.2 功能模块的调用关系图图2.3调用关系图3.3系统子程序及功能设计本系统共设置6个函数,其中主要包括主函数。
数据结构回文判断在计算机科学和编程的世界里,数据结构是非常重要的一部分。
而回文判断作为一个常见的问题,在数据结构的应用中有着不少有趣的解法。
首先,咱们得搞清楚啥是回文。
简单来说,回文就是一个正着读和倒着读都一样的字符串或者序列。
比如“12321”“racecar”,不管你从前往后读,还是从后往前读,结果都是一样的。
那怎么判断一个字符串是不是回文呢?这就需要用到一些数据结构和算法的知识了。
一种常见的方法是使用数组。
我们可以把要判断的字符串的每个字符都存到一个数组里,然后从数组的两头开始比较。
一头从开头,一头从结尾,一个一个地比,如果对应的字符都一样,那就说明是回文;只要有一对不一样,那就不是回文。
举个例子,比如要判断“racecar”这个字符串是不是回文。
我们先把它的每个字符存到一个数组里:'r','a','c','e','c','a','r'。
然后从两头开始比较,先比较第一个字符'r'和最后一个字符'r',一样;再比较第二个字符'a'和倒数第二个字符'a',也一样;就这样一直比下去,发现都一样,所以“racecar”就是回文。
不过,使用数组来判断回文有一个小小的问题。
那就是如果字符串很长,需要的存储空间就会比较大。
这时候,我们可以考虑使用栈这种数据结构。
栈的特点是先进后出。
我们可以把字符串的前半部分字符依次压入栈中,然后再依次取出栈顶的字符和字符串后半部分的对应字符进行比较。
比如说对于字符串“12321”,我们先把“123”依次压入栈中,然后从字符串的第四个字符开始,和从栈中取出的字符比较。
先取出栈顶的 3 和第四个字符 2 比较,不一样,那就不是回文;如果都一样,那就是回文。
除了栈,队列也能派上用场。
我们可以把字符串的前半部分放入队列,后半部分按照相反的顺序放入另一个队列。
然后依次取出两个队列的队头元素进行比较,如果都一样,就是回文,否则就不是。
实验题目回文判断的算法一、需求分析1.程序的功能:实现对字符序列是否是一个回文序列的判断2.输入输出的要求:从键盘读入一组字符序列,判断是否是回文,并将结果显示在屏幕上3.测试数据:回文字符序列输入:非回文字符序列输入:二、概要设计1.本程序所用的抽象数据类型的定义:typedef struct{char item[STACKSIZE];int top;}SqStack;typedef struct QNode{char data;struct QNode *next;}LQNode, *PQNode;typedef struct{PQNode front,rear;} LinkQueue;2.主程序的流程及各程序模块之间的层次关系。
(1)int InitStack(SqStack *S):栈初始化模块,即初始化一个空栈,随后对该空栈进行数据的写入操作;(2)int Push(SqStack *s, char data):入栈操作,即给空栈中写入数据,数据长度有宏定义给出;(3)int Pop(SqStack *s, char *data):出栈操作,即将栈中的数据输出,由于栈的操作是先进后出,因此,出栈的数据是原先输入数据的逆序;(4)int InitQueue(LinkQueue *q):队列初始化,即初始化一个空队列,最后对该空队列进行数据的写入操作;(5)int EnQueue(LinkQueue *q, char item):入队操作,即给空队列中写入数据,数据长度一样有宏定义给出;(6)int DeQueue(LinkQueue *q, char *item):出队操作,即将队列中的数据输出,由于队列的操作是先进先出,因此,出队的数据室原先输入数据的正序;(7)int main():主函数,用于调用前面的模块,进行出队数据与出栈数据的比较,判断输入的序列是否是回文序列。
模块之间关系及其相互调用的图示:三、详细设计1.采用c语言定义相关的数据类型整形,字符型,指针类型,聚合类型,自定义类型2.写出各模块的伪码算法:参照源程序(1)int InitStack(SqStack *S)(2)int Push(SqStack *s, char data)(3)int Pop(SqStack *s, char *data)(4)int InitQueue(LinkQueue *q)(5)int EnQueue(LinkQueue *q, char item)(6)int DeQueue(LinkQueue *q, char *item)四、调试分析1.调试中遇到的问题及对问题的解决方法: 问题:程序出现未知错误。
数据结构回文判断实验类型:验证型【问题描述】试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1&序列2’模式的字符序列。
其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。
例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3 &3 -1’则不是。
思路:首先建立一个字符数组,长度为100,然后向数组中写入索要判断的字符串。
定义两个指针,一个指向队头,一个指向队尾,队头的指针不断递增,队尾的指针不断递减,在P1<P2的前提下,两个地址上的数据进行比较,如相等则两地址分别向中间靠拢,如对比的结果不同则跳出,但此时P1指针小于P2指针,所以判断字符串不是回文;如两者一直相等直到他们的地址P1=P2或P1>P2(字符串为奇数个)时,跳出并判断为回文;在这其中P1指针的值与P2指针的值有不等的情况就直接判定不是回文。
代码源:// huiwen.cpp : Defines the entry point for the console application. //#include <stdio.h>#include <string.h>int main( void ){char str[100];printf("请输入字符串:");gets( str ); //输入字符char *p1 = str, *p2 = str + strlen(str) - 1;//指针定义for( ; p1 < p2 && *p1 == *p2; ++p1, --p2 );//FOR循环体为空puts( p1 < p2 ? "所输字符串不是回文" : "所输字符串是回文" );return 0;}运行结果:实验结论:通过本次的课程设计,这里的回文就是把回文是指正读和反读均相同的字符序列,所以可以用程序将字符串颠倒后与原字符串相比较,所用到的数据结构有单链表和栈,单链表用于存储字符串,栈用于对单链表中字符串的判定。
实验一单链表的基本操作一.要求:(1)依次从键盘读入数据,建立带头结点的单链表;(2)输出单链表中的数据元素(3)求单链表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。
二:算法设计:(1)用到的结构:逻辑结构(循环结构,条件结构,顺序结构)存储结构(线性单链表)(2)算法设计思路:首先利用尾插发创建一个单链表status createlist(LinkList &L)然后通过void print(LinkList L)方法输出,通过int ListLength(LinkList L)方法得到链表的长度,通过char GetElem(LinkList L,int i)方法,当第i 个元素存在时,其值赋给e并返回,然后通过status ListInsert(LinkList &L,int i,ElemType e) 在头结点单链线性表L中第i个位置之前插入元素e,最后通过status ListDelete(LinkList &L,int i) 删除L中第i个元素,并用e 返回其值。
三:调试和测试:(1)调试过程总结:这些是对但链表的基本操作,算是对单链表的总结。
C++不同于java,需要定义如OK,false等。
还有有的包没有正确的引入。
(2)三组测试数据及实验结果:第一组:测试ascxzbn第二组:测试dbcmgkfko第三组:测试oehfdklsdjsk实验二回文判断一实验要求:(1)数据从键盘读入;(2)输出要判断的字符串;(3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。
二:算法设计:(1)用到的结构:逻辑结构(循环结构,条件结构,顺序结构)存储结构(链式栈)(2)算法设计思路:先创建一个栈的大小为100,然后用void InitStack( SeqStack *S)方法初始化一个空栈,紧接着用int EmptyStack(SeqStack *S)还有int FullStack (SeqStack *S)分别判断栈是空还是满。
数据结构C语言版判断回文数实验报告实验目的:1. 了解回文数的定义和判断方法2. 掌握C语言中字符串的处理方法3. 学习如何使用栈来判断字符串是否为回文数实验原理:回文数是一个正整数,它的各位数字倒过来排列后仍然是同一个数。
比如121、12321就是回文数,而123、56789就不是回文数。
判断一个字符串是否为回文数,可以将字符串中的每一个字符逐个压入栈中,然后再依次将栈中的字符弹出,与原字符串中的字符逐个比较。
实验步骤:1. 定义一个栈结构体,其中包含一个整型数组和一个顶部指针变量。
顶部指针变量用于指向栈顶的位置。
```c#define MAXSIZE 100 // 定义栈中最大元素数量typedef struct {int data[MAXSIZE]; // 栈中元素数据int top; // 栈顶指针} Stack;```2. 定义一个函数用于判断字符串是否为回文数。
函数接收一个字符串指针作为参数。
首先计算字符串的长度,然后将字符串中的每一个字符压入栈中。
接着依次将栈中的字符弹出,与原字符串中的字符逐个比较。
如果两者不同,则说明该字符串不是回文数,函数返回0并退出。
如果所有字符都比较完成后没有发现不同,说明该字符串是回文数,函数返回1并退出。
// 将字符串中的每一个字符压入栈中for (int i = 0; i < len; i++) {s.data[++s.top] = str[i];}return 1;}```3. 在主函数中,首先要输入一个字符串,然后调用is_palindrome函数进行判断,最后输出判断结果。
实验结果:测试数据:输入:"12321"请输入一个字符串:12321该字符串是回文数"abcde""aabbabbaa"分析:实验结果验证了判断回文数的方法和字符串操作的正确性,同时掌握了使用栈来判断字符串是否为回文数的方法,有助于更好地理解栈的概念和应用。
回文判断实验二
洛阳理工学院实验报告
系别计算机系班级B13053
学号B13053235 姓名李登辉
2
课程名称数据结构实验日期2014.3.28 实验名称栈和队列的基本操作成绩
实验目的:
熟悉掌握栈和队列的特点,掌握与应用栈和队列的基本操作算法,训练和提高结构化程序设计能力及程序调试能力。
实验条件:
计算机一台,Visual C++6.0
实验内容:
1.问题描述
利用栈和队列判断字符串是否为回文。
称正读与反读都相同的字符序列为“回文”序列。
要求利用栈和队列的基本算法实现判断一个字符串是否为回文。
栈和队列的存储结构不限。
2.数据结构类型定义
typedef struct
{
char elem[MAX];
int top;
}SeqStack; 顺序栈
3.模块划分
void InitStack(SeqStack *S):栈初始化模块,
int Push(SeqStack *S,char x,int cnt):入栈操作
int Pop(SeqStack * S,char * x):出栈操作
void InitQuene(SeqQuene *Q):队列初始化
int EnterQuene(SeqQuene *Q,char x,int cnt):入队操作
int DeleteQuene(SeqQuene *Q,char *x,int cnt):出队操作
void main():主函数
4.详细设计
#include<stdio.h>
#include<string.h>
#define MAX 50
#define FALSE 0
#define TURE 1//定义栈
typedef struct
{
char elem[MAX];
int top;
}SeqStack;
//定义循环队列
typedef struct
{
char element[MAX];
int front;
int rear;
}SeqQuene;
//初始化栈
void InitStack(SeqStack *S)
{
S->top = -1;//构造一个空栈
}
//入栈
int Push(SeqStack *S,char x,int cnt)
{
if(S->top == cnt-1)
return(FALSE);
S->top++;
S->elem[S->top] = x;
return(TURE);
}
//出栈
int Pop(SeqStack * S,char * x)
{
if(S->top == -1)
return(FALSE);
else
{
*x = S->elem[S->top];
S->top--;
return(TURE);
}
}
//初始化队列
void InitQuene(SeqQuene *Q)
{
Q->front = Q->rear = 0;
}
//入队
int EnterQuene(SeqQuene *Q,char x,int cnt) {
if((Q->rear+1)%(cnt+1) == Q->front) return(FALSE);
Q->element[Q->rear] = x;
Q->rear = (Q->rear+1)%(cnt+1);
return(TURE);
}
//出队
int DeleteQuene(SeqQuene *Q,char *x,int cnt)
{
if(Q->front == Q->rear)
return(FALSE);
*x = Q->element[Q->front];
Q->front = (Q->front+1)%(cnt+1);
return(TURE);
}
//主函数
void main()
{
int i,cnt,flag;
SeqStack s;
SeqQuene q;
char a[MAX],b[MAX],c[MAX];
flag=0;
printf("请输入由*结束且小于%d的回文序列:\n",MAX);
for(i = 0;i<MAX+1;i++)
{
scanf("%c",&a[i]);
if(a[i] == '*')
break;
}
cnt = i;
printf("输入了有%d个字符。
\n",cnt);
InitStack(&s);
InitQuene(&q);
for(i = 0;i<cnt;i++)
{
EnterQuene(&q,a[i],cnt);
Push(&s,a[i],cnt);
}
printf("正序字符串为:\n");
for(i = 0;i<cnt+1;i++)
{
DeleteQuene(&q,&b[i],cnt);
printf("%c",b[i]);
}
printf("\n");
printf("逆序字符串为:\n");
for(i = 0;i<cnt+1;i++)
{
Pop(&s,&c[i]);
printf("%c",c[i]);
}
printf("\n");
for(i = 0;i<cnt+1;i++)
{
if(b[i] == c[i])
flag = 1;
else
{
flag = 0;
break;
}
}
if(flag)
printf("此序列是回文序列!");
else
printf("此序列不是回文序列!");
printf("\n");
}
}
测试数据及结果:
实验总结:读取一个字符,同时存储在顺序栈与链队列之中,直到字符序列的最后一个字符为*停止插入。
在程序中设置了一个标志位flag,将输入的序列分别做入栈、出栈、入队、出队操作,若出栈与出队的数据完全一致,则将flag标志为1,否则为零。
Flag 为1,则表示该序列是回文序列,否则,为非回文序列。