回文字符串的判断

“回文”指的是一个字符串从前往后读和从后往前读都是一样的,则称这个字符串为回文。比如“qwerewq”是一个回文字符串,“gda534”则不是回文串。在数据结构中,可以通过使用“栈‘这种数据结构来实现,这里单从C语言的语法层面上来实现它。

#include
#include
#include
#include
#pragma warning(disable:4996)
//回文判断
//初始化字符串,其实这一步可以完全不要
#if 0
void init(char *array){
     
	for (int i = 0; i < 100; i++){
     
		array[i] = 0;
	}
}
#endif
//先计算字符串的长度
//其实可以调用库函数
//自己实现也可以
int getStringSize(char *array){
     
	int count = 0;
	/*for (int i = 0; i < 100; i++){
		if (array[i] != 0){
			count++;
		}
		这种方法比较笨,需要遍历整个字符串
		但是我们知道字符串后面都有一个‘\0’
		那就不用整个的遍历整个字符串了
	}*/
	while (*array){
     
		count++;
		array++;
	}
	//也可以直接调用库函数,库函数也跟上面这么写的差不多
	//但是更简单
	//自己练习一下
	return count;
}
int isPalin(char *array, int size){
     //判断是否回文串
	//int count = getStringSize(*array);
	//如果直接把字符串长度的参数带进来的话就不用再重新计算了
	//如果没有带进来则需要重新计算,不过模块之间的耦合性还是要尽量低一点
	//不然如果在这里计算字符串长度的话可能会改变指针array的指向,而后面还需要用到,
	//需要提前把array保存或者复制
	//有时候容易忘
	assert(array); //如果需要对字符串检查
	assert(size);//必须要求输入有效字符串,这可能对程序不利
	/*
	int left = 0;
	int right = size-1;
	while (left <= right){//从两端往中间检查
		if (array[left] != array[right]){
			return 0;
		}
		left++;
		right--;
	}*/
	//也可以用指针完成
	char *left = array;
	char *right = left + size - 1;
	while (left <= right){
     
		if (*left == *right){
     
			left++;
			right--;
		}
		else{
     
			return 0;
		}
	}
	return 1;
}
int main(){
     
	char string1[100];
	//init(string1);
	//printf("%s\n", string1);
	printf("Please Enter your String:");
	gets(string1);//从控制台输入字符串,包含空格
	//printf("%s\n", string1);
	//int count1 = getStringSize(string1);
	if (isPalin(string1, getStringSize(string1))){
     
		printf("yes!\n");
	}
	else{
     
		printf("no!\n");
	}
	system("pause");
	return 0;

}

这里需要明确一下,上面一会用下标引用的方式访问字符串,一会又用指针访问,其实指针也可以使用下标引用的方式:

比如array[i]也可以写成*array[i]//但是一般不这么写

两种方式都可以实现,那么这是不是一样的呢?也就是说指针和数组有什么关系呢?
答案是不一样,指针和数组没有关系。指针是指针,数组是数组,而这里需要引出一个概念:数组在进行参数传递时发生降维,降维为其内部类型的指针。而不是发生参数的值拷贝。而且只有数组传参时会发生降维
整型数组传参时降维为整型类型的指针int*
字符数组传参时降维为字符类型指针char*
。。。
所以有时候写函数的参数的时候有时候写成(int arr[])
有时候写成(int *arr),其实是一样的
上面的形参其实是个指针,不信可以做个测试:

#include
int getsize(int arr[]){
     
	return sizeof(arr);//在函数里看看数组多大
}

int main(){
     
	int arr[]={
     1,2,3,4,5,6,7,8,9,0};
	int size = sizeof(arr);//看arr[]占多大空间
	int sizeof_arr = getsize(arr);//可以看看两个数是不是一样大
	return 0;
}

这里只是说他们的引用方式是一样的,而数组和指针其实是没有关系的,要分清楚一点。至于为什么是这样以及更多的疑问以后有机会再说。这里只是为了不混淆。

你可能感兴趣的:(回文字符串的判断)