回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。
回文串:字符串反转后和原字符串相同同,比如aba
判断代码如下,思路是从头尾开始依次比较,全部相同就代表是回文串
算法实现:
#include<stdio.h>
#include<string.h>
int main(void)
{
int i,j;
int len; //用于记录字符串长度
char S1[1005];
char S2[1005];
printf("请输入需要判断的字符串:");
gets(S1);
len = strlen(S1);
for(i=len-1,j=0;i>=0;i--,j++)
{
S2[j] = S1[i]; //将S1逆序赋给S2
}
for(i=0,j=0;i<len;i++,j++)
{
if(S1[i]!=S2[i]) //如果S1正序和逆序不同,则不是回文字符串
{
printf("该字符串不是回文字符串!");
break;
}
else if(i==len-1)
{
printf("该字符串是回文字符串");
}
}
return 0;
}
用栈实现:
typedef struct StackNode
{
char date;
struct StackNode* next;
}*LinkStack,StackNode;
//初始化链栈
void InitStack(LinkStack* S)
{
*S=NULL;
}
//压栈
void PushStack(LinkStack* S,char e)
{
LinkStack p;
p=(LinkStack)malloc(sizeof(StackNode));
p->date=e;
p->next=*S;
*S=p;
}
//出栈
void PopStack(LinkStack* S,int* elem)
{
LinkStack p;
*elem=(*S)->date;
p=(*S);
*S=(*S)->next;
free(p);
}
//判断回文,存储字符串的一半,利用链栈的特性判断字符串是否是回文
int Is_cric(LinkStack* S,char arr[],int str)
{
int i=0;
int j=0;
int c;
//存储字符串的一半
for(i=0;i<str/2;i++)
{
PushStack(S,arr[i]);
}
//把每个字符压出来判断是否与后一半字符相等
while((*S)!=NULL)
{
int t=arr[j+str/2];
PopStack(S,&c);
if(t!=c)
{
printf("不是回文\n");
return 0;
}
j++;
}
printf("是回文\n");
return 1;
}
int main()
{
LinkStack S;
int str=0;
char arr[100];
printf("请输入字符串;>");
scanf("%s",arr);
str=strlen(arr);
InitStack(&S);
Is_cric(&S,arr,str);
return 0;
}
有帮助的话采纳一下
首尾字符逐个比较即可
#include <stdio.h>
#include <string.h>
int huiw(char *s)
{
int i=0;
int len = strlen(s);
for(i=0;i<len/2;i++)
if(s[i] != s[len-i-1])
return 0;
return 1;
}
int main()
{
char s[100];
int res = 0;
scanf("%s",s);
res = huiw(s);
if(res == 1)
printf("是回文");
else
printf("不是回文");
}
#include<stdio.h>
#include<string.h>
int palind(char *s)
{
int i,j;
j = strlen(s)
j--;
for(i=0;i<j && s[i]==s[j];i++,j--)
{
if(i>j)
return 0;
else
return 1;
}
}
int main()
{
char s[100];
printf("请输入字符串:\n");
scanf("%s",&s);
if(palind(s)==1)
printf("字符%s是回文符",s);
else
printf("字符%s不是回文符",s);
}
如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int isHuiwen(char* p)
{
int i = 0;
int j = strlen(p) - 1;
for (; i < j; i++, j--)
{
if (p[i] != p[j])
return 0;
}
return 1;
}
int main()
{
char buf[100] = { 0 };
scanf("%s", buf);
if (isHuiwen(buf))
printf("%s 是回文",buf);
else
printf("%s 不是回文", buf);
return 0;
}
1.可以对原字符串实现转置,然后判断转置后的的字符串与愿字符串是否相等
2.从下标为0到字符串强度的一半,与字符串的后一半进行比较,下标为i==n-1-i,n为数组长度