例题一:
6-1 判断回文字符串 (20 分)
本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。
函数接口定义:
bool palindrome( char *s );
函数palindrome
判断输入字符串char *s
是否为回文。若是则返回true
,否则返回false
。
裁判测试程序样例:
#include <stdio.h>
#include <string.h>
#define MAXN 20
typedef enum {false, true} bool;
bool palindrome( char *s );
int main()
{
char s[MAXN];
scanf("%s", s);
if ( palindrome(s)==true )
printf("Yes\n");
else
printf("No\n");
printf("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
thisistrueurtsisiht
输出样例1:
Yes
thisistrueurtsisiht
输入样例2:
thisisnottrue
输出样例2:
No
thisisnottrue
这道题给的裁判测试样例是使用C语言的指针写的,所以,在函数中,我们依然还是使用指针操作比较简单,我先把源码放在下面我们再来分析:
bool palindrome(char *s){ //定义返回值为布尔类型的函数
char *a = s; //定义一个新指针指向s
int i = 0,j=0,k=0;
while (*a != '\0'){ //使用指针a最字符串进行遍历,统计字符串位数
a++;
i++;
}
a--; //因为最后一位为'\0'所以减一位
while (*s != '\0'){ //进行两个比较
if (*s == *a){
k++;
}
else{
return false;//在遍历过程中有对应不相等的项,直接返回false
}
s++;//指针s正向遍历与a进行比较
a--;//指针a反向遍历与s进行比较
}
if (k == i){ //如果k与i相等则说明在遍历过程中字符串正向与反向对应相等,返回true
return true;
}
}
现在来讲思路:回文字符串的意思就是字符串首尾对应相等,那么我们在处理该问题的过程中就要存在一个正向与反向的问题,所以说在程序中,我们重新定义一个指针a指向s,重新定义一个指针的目的就是为了做比较来使用,因为指针不像数组那样可以直接逆向进行操作,现在有了一个新指针,其实在新定义的指针a与指针s完全相等,但是执行统计字符之后,指针a指向的是字符串的最后一个字符。首先在函数里面,先对字符串进行字符个数统计,统计结束之后,保存统计数据,后面会用到。然后就是两个字符串的双向比较了,在比较过程中一旦发现不相等的情况直接返回false,表是该字符串不是回文串,在没有发现此类情况的时候,一直进行这比较,并且两个指针指向的字符始终进行着是否等价的比较,直至指针s指向了字符串的结束符。最后再加一个判断,就是k和i是否相等,为什么k和i相等了,就说明字符串是回文串了呢,因为在程序中呢,k始终是记录着s与a是否相等的,而i呢又是遍历字符串之后整个字符串的长度,所以说,只要判断了k和i是否相等,就能判断该字符串是否为回文字符串。