我正在使用堆栈检查回文。我想接收来自用户的输入,确定它是否是回文,并输出结果
我想在不使用删除空格和特殊字符的方法的情况下忽略它,但是它不像我想的那样。
代码
//
int palindrome(char string[])
{
Stack s;
int ii;
initStack(&s);
for (ii = 0; string[ii] != ' '; ii++)
{
if (string[ii] >= 'A' && string[ii] <= 'Z')
string[ii] += 32;
if (string[ii] >= 'a' && string[ii] <= 'z')
{
push(&s, string[ii]);
}
}
//printf("%sn", string);
for (ii = 0; string[ii] != 0; ii++)
{
if (string[ii] != pop(&s))
{
return 0;
}
}
return 1;
}
int main()
{
char string[MAX_STACK_SIZE];
printf("Enter a Stringn");
gets_s(string);
if (palindrome(string))
printf("palindrome!n");
else
printf("Xn");
return 0;
}
在这一部分中,指定了'a'和'z'之间的范围,我想知道为什么不排除特殊字符和空格并将其压入堆栈。
for (ii = 0; string[ii] != ' '; ii++)
{
if (string[ii] >= 'A' && string[ii] <= 'Z')
string[ii] += 32;
if (string[ii] >= 'a' && string[ii] <= 'z')
{
push(&s, string[ii]);
}
}
问题是for循环
for (ii = 0; string[ii] != 0; ii++)
{
if (string[ii] != pop(&s))
{
return 0;
}
}
不跳过源字符串中的特殊字符。
注意源字符串不应该在函数内被改变。也不要使用像32
这样的神奇数字。使用标准C函数isalpha
和tolower
函数可以如下方式查找示例
#include <ctype.h>
//...
int palindrome( const char string[] )
{
Stack s;
initStack( &s );
for ( const char *p = string; *p != ' '; ++p )
{
char c = *p;
if ( isalpha( ( unsigned char )c ) )
{
c = tolower( ( unsigned char )c );
push( &s, c );
}
}
int equal = 1;
for ( const char *p = string; equal && *p != ' '; ++p )
{
char c = *p;
if ( isalpha( ( unsigned char )c ) )
{
c = tolower( ( unsigned char )c );
equal = c == pop( &s );
}
}
return equal;
}