回文串:一串正着读和反着读都是一样的一种特殊字符串
例如:level、abba 这两个字符串就被称为回文串
判断回文串,我推荐两种方法:反转比较法和中分比较法(名称是自己起的哈,有些丑陋)
一、反转比较法
对于c++的同学这个就十分简单了
我们输入的字符串类型定位string型,然后使用reverse函数就可以,然后我们直接比较str1与str2是否相等,相等的话那么就表示输入的字符串为回文串。
reverse(str2.begin(), str2.end());
当然,输入char、int数组也是可以,直接使用reverse函数
reverse(str2,str2+strlen(str2));
对于不让用函数或者是c的同学,那就自己写一个reverse函数,这个还是比较好实现的,定义一个新的数组,然后通过递归进行反转。
void reverse(char * str)
{
int len=strlen(str);
char *ch=str+len-1;
while(len>1)
{
char tmp=*str;
*str=*ch;
*ch='\0';
reverse(str+1);
*ch = tmp;
len--;
}
}
二、中分比较法
这种方法的话这里我介绍用带头结点的单链表存每一个元素,我们再建立一个栈,我们用栈存放前半部分的数据,如果数据元素个数是奇数的话,我们加一个特判,不处理这个节点。当链表当前节点走到一半后,我们对栈顶元素与当前节点进行比较,如果不相等,那么就说明不是回文串,,如果相等栈顶元素出栈,指针往后一位。如果走到结尾都相等的话,那么就表示是回文串。
下面代码输入格式为:
字符串长度
字符串
例如:
5
abbba
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
char num;
struct node *next;
}LinkList;
LinkList *init(LinkList *l)
{
l=(LinkList *)malloc(sizeof(LinkList));
l->next=NULL;
return l;
}
LinkList *create(int n)
{
int i,x;
LinkList *l,*tmp,*p;
l=init(l);
tmp=l;
for(i=0;i<n;i++)
{
scanf("%c",&x);
p=(LinkList *)malloc(sizeof(LinkList));
p->num=x;
p->next=NULL;
tmp->next=p;
tmp=tmp->next;
}
return l;
}
int cala(LinkList *l,int n)
{
char a[1005];
int mid=n/2,i=1,na=0;
LinkList *tmp;
tmp=l->next;
while(tmp)
{
if(mid+1==i&&n%2!=0)
{
i++;
tmp=tmp->next;
continue;
}
else if(i<=mid) a[na++]=tmp->num;
else if(i>mid)
{
if(a[--na]!=tmp->num)
{
return 0;
}
}
i++;
tmp=tmp->next;
}
return 1;
}
int main()
{
LinkList *l;
int n,i,flag;
scanf("%d",&n);
getchar();
l=create(n);
flag=cala(l,n);
if(flag) printf("Yes\n");
else printf("No\n");
return 0;
}