c -使用堆栈检查给定字符串是否为回文



我正在使用堆栈检查回文。我想接收来自用户的输入,确定它是否是回文,并输出结果

我想在不使用删除空格和特殊字符的方法的情况下忽略它,但是它不像我想的那样。

代码

//
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函数isalphatolower

函数可以如下方式查找示例

#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;
}

最新更新