这个怎样正确程序实现

回文是指正读反读均相同的字符序列,如“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为数组长度

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632