习题8-8 判断回文字符串 (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

题解:

/*小知识:typedef enum {false, true} bool;
typedef重新命名;
枚举enum {false, true} bool; bool为枚举变量
大概的意思就是重新命名枚举enum然后bool可以当定义数据的标识符,bool里面有两个值分别是true和false
*/

/*方法一:利用指针,定义新指针指向s数组的最后一个元素,然后定一个中间结点,前后两两判断,只要有不一样的就不是回文*/
bool palindrome( char *s )
{
    
    
	int i; //循环变量
	char *p = s + strlen (s) - 1; //定义新指针p指向s数组的最后一个元素(s是s数组的首地址加上s数组的长度减一,就是最后一个元素的地址,因为c语言下标从0开始,所以需要减一)
	bool flag = true; //定义布尔型变量flag判断是否是回文数,初值为ture
	
    /*循环判断前后元素是否一样*/
    // for (i = 0; s [i] != '\0' ; i++, p-- , s++) //上下两种循环都行
	for (i = 0; i < strlen (s) ; i++, p-- , s++) //循环开始i赋值为0,到小于s数组的长度位置,每一轮循环不要忘记i循环变量要加一,指针变量p由于是指向最后一位元素,所以需要减减指向上一个元素,而指针s是指向首地址的所以需要加加指向下一个元素
	{
    
    
		if (*p != *s) //如果前后一一对应的元素有不一样的就flag赋值为false,直接退出循环
		{
    
    
			flag = false;
			break;
		}
	}

	return flag; //返回flag的值给palindrome函数
}
/*方法二:利用新数组,把旧数组的倒序给新数组看看结果是否相等*/
// bool palindrome( char *s )
// {
    
    
// 	int i; //循环变量
// 	char p [MAXN]; //新数组
// 	bool flag = true; //定义布尔型变量flag判断是否是回文数,初值为ture
// 	int j = 0; //数组下标变量,初值为0
	
//     /*数组s逆序循环赋值给新数组p*/
// 	for (i = strlen(s) - 1; i >= 0 ; i--) //逆序的初值是数组s的长度减一,因为c语言数组是从0开始的
// 	{
    
    
// 		p [j++] = s [i];
// 	}
// 	p [j] = '\0'; //字符串结束标识不要忘记
// 	if (strcmp(s,p) != 0) flag = false;  //所以要是返回值不等于0就表示两个数组不一样,flag赋值为false
//     /*strcmp函数判断两个数组是否相等,返回1表示s>p;返回-1表示s<p;返回0表示s=p*/

// 	return flag; //返回flag的值给palindrome函数
// }

/*方法三:方法一的数组形式*/
// bool palindrome( char *s )
// {
    
    
// 	int i; //循环变量
// 	bool flag = true; //定义布尔型变量flag判断是否是回文数,初值为ture
// 	int j = strlen (s) - 1; //另一个s数组的下标,指向s数组的最后一个元素

//     /*循环判断前后元素是否一样*/
// 	// for (i = 0; i < strlen (s) ; i++)
// 	for (i = 0; s [i] != '\0' ; i++) //上下两种循环方式都可以
// 	{
    
    
// 		if (s [j--] != s [i]) //如果前后一一对应的元素有不一样的就flag赋值为false,直接退出循环
// 		{
    
    
// 			flag = false;
// 			break;			
// 		}
// 	}
	
// 	return flag; //返回flag的值给palindrome函数
// }

猜你喜欢

转载自blog.csdn.net/qq_44715943/article/details/115152209
今日推荐