【问题标题】:check whether the given string is palindrome using stack使用堆栈检查给定字符串是否为回文
【发布时间】:2021-12-08 11:54:10
【问题描述】:

我正在使用堆栈检查回文。我想接收用户的输入,判断是否是回文,并输出结果

我想忽略它而不使用删除空格和特殊字符的方法,但它没有按我的意愿进行。

代码是

//
int palindrome(char string[])
{
    Stack s;

    int ii;

    initStack(&s);

    for (ii = 0; string[ii] != '\0'; ii++)
    {
        if (string[ii] >= 'A' && string[ii] <= 'Z')
            string[ii] += 32;

        if (string[ii] >= 'a' && string[ii] <= 'z')
        {
            push(&s, string[ii]);

        }
    }
    //printf("%s\n", 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 String\n");
    gets_s(string);

    if (palindrome(string))
        printf("palindrome!\n");
    else
        printf("X\n");



    return 0;
}

在这部分中,指定了'a'和'z'之间的范围,我想知道为什么不排除特殊字符和空格并将其压入堆栈。

    for (ii = 0; string[ii] != '\0'; ii++)
    {
        if (string[ii] >= 'A' && string[ii] <= 'Z')
            string[ii] += 32;

        if (string[ii] >= 'a' && string[ii] <= 'z')
        {
            push(&s, string[ii]);

        }
    }

【问题讨论】:

    标签: c for-loop stack c-strings palindrome


    【解决方案1】:

    问题是这个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 != '\0'; ++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 != '\0'; ++p )
        {
            char c = *p;
        
            if ( isalpha( ( unsigned char )c ) )
            {
                c = tolower( ( unsigned char )c );
                equal = c == pop( &s );
            }
        }
    
        return equal;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 2013-07-26
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2020-12-19
      • 2013-04-29
      • 2012-04-05
      相关资源
      最近更新 更多