C语言使用栈实现回文判断时空格特殊字符未被过滤问题咨询
回文判断代码问题排查
你写的入栈逻辑没有问题,空格和特殊字符并不会被压入栈,你观察到的不符合预期的现象是由比对阶段的逻辑错误导致的。
具体错误点
- 你在第二个循环中直接遍历了原始输入字符串的所有字符,其中包含你需要忽略的空格、特殊字符,但栈中仅存储了过滤后的小写字母,两个序列的内容长度、顺序都无法对应,才会出现匹配失败的问题,并非空格被入栈。
例如输入A b a,栈中仅会压入a、b、a三个字母,但遍历原始字符串时,第二个字符是空格,会直接和栈弹出的b进行比对,自然会匹配失败,会让你误以为空格被存入了栈中。
修复方案
比对阶段也要和入栈阶段做相同的过滤逻辑,仅取原始字符串中的字母,转成小写后再和栈弹出的字符比对,非字母字符直接跳过即可。
修正后的完整palindrome函数代码如下:
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]); } } // 修正后的比对逻辑,过滤非字母字符 for (ii = 0; string[ii] != 0; ii++) { char curr = string[ii]; // 统一转小写 if (curr >= 'A' && curr <= 'Z') curr += 32; // 非字母字符直接跳过,不参与比对 if (!(curr >= 'a' && curr <= 'z')) continue; // 仅字母和栈弹出值比对 if (curr != pop(&s)) { return 0; } } return 1; }
内容的提问来源于stack exchange,提问作者user17213322
相关产品推荐
相关产品推荐

