#include
#include
class String{
private:
charstr;
int y;
public:
String(chars)
{
int n=strlen(s);
str=new char[n+1];
strcpy(str,s);
y=0;
}
void huiwen();
void show();
~String()
{ if(str) delete []str;}
};
void String::huiwen()//判断str所指向的字符串是否为回文字符串;
{
int n,judge=0;
n=strlen(str);
for(int i=0;i<(n/2);i++)
{
if(str[i]==str[n-1-i]) judge++;
}
if(judge==i) y=1;
}
void String::show()//输出;
{
if(y==1) cout<<"y=1,¸该字符串是回文数"<
else cout<<"y=0,该字符串不是回文数"<
}
void main()//测试;
{
char s[]="ababcedbaba";
String test(s);
test.huiwen();
test.show();
}
n=strlen(str);
for(int i=0;i<(n/2);i++)
{
if(str[i]==str[n-1-i]) judge++;
}
if(judge==i) y=1;
}
重点是这一段
回文的特点是什么,就是首尾对称,比如 abccba , abcba
因此,判断回文,只需要首尾比较,然后各自向中间移动,但首不能大于尾
代码中for循环条件是i<n/2,意思就是实际比较次数是字符串长度的一半
if(str[i]==str[n-1-i]) 就是获取首尾字符,判断是否相等,相等则计数。这里可以不用计数,只需要判断不相等就可以跳出循环,不需要再比下去了,有一个不同就不是回文
比如abcba,先比较首尾的a,相同则下个循环i++,使得i为1,而n-i-1就是右侧的b字符。两个b也相同,再i++,此时由于i>n/2,就比较结束,判断字符串是回文
huiwen函数中,if(judge==i) y=1; 这里是错误的,因为 i 是for循环中的局部变量,出了for循环以后,i 就被回收了。而且用i来判断是不对的,因为哪怕是回文,for循环中的i++会比judege++多执行一次。代码修改如下:
void String::huiwen()//判断str所指向的字符串是否为回文字符串;
{
int n, judge = 1;//修改1 judege初始化为1
n = strlen(str);
for (int i = 0; i < (n / 2); i++)
{
if (str[i] != str[n - 1 - i])
{
judge = 0; //如果不相等,就把judege设为0,并结束循环,因为只要不相等,就没必要继续判断了
break;
}
}
if (judge == 1) y = 1; //这里判断judge是否为1
else y = 0; //否则,y=0
}
huiwen()函数的流程图如下: