c - 检查字符串是否为回文时出错
问题描述
我正在尝试制作一个 C 程序来检查字符序列是否为回文。我必须使用堆栈和递归函数。
作为输入给出的第一个数字是字符串的长度。该程序在偶数长度下正常工作,但不能识别奇数字符串的回文性。我一直试图找出错误至少一个小时,但没有运气。
这是代码。
#include <stdio.h>
#include <stdlib.h>
struct c {
char cha;
struct c *nextPtr;
};
typedef struct c Character;
void push(Character **headPtr, char c) {
Character *newC = malloc(sizeof(Character));
if(newC == NULL) {
puts("Insufficient memory.");
}
newC->cha = c;
newC->nextPtr = *headPtr;
*headPtr = newC;
}
char pop(Character **headPtr) {
if(*headPtr != NULL) {
Character *tempPtr = *headPtr;
char c = (*headPtr)->cha;
*headPtr = (*headPtr)->nextPtr;
free(tempPtr);
return c;
}
}
void isPalindrome(int stringLength, int charNum) {
static Character *headPtr = NULL;
if(stringLength == 1) {
puts("Palindrome");
exit(0);
}
if(charNum < (stringLength/2)) {
char c = getchar();
push(&headPtr, c);
return isPalindrome(stringLength, charNum+1);
}
if(stringLength % 2) {
getchar();
}
char d = getchar();
char e = pop(&headPtr);
if(d != e) {
puts("Not palindrome");
exit(0);
}
return;
}
int main() {
int n;
scanf("%d", &n);
while(getchar()!='\n');
isPalindrome(n, 0);
puts("Palindrome.");
return 0;
}
您可以自己尝试,只需输入一个奇数,然后输入,而不是一个字符序列。该程序将无法识别它是否是回文,并且总是说它不是,甚至会做一些更奇怪的事情,比如根本不输出任何东西并等待更多输入。
我真的不知道我错过了什么。
解决方案
没关系,我自己找到了解决方案。
#include <stdio.h>
#include <stdlib.h>
int isPal = 1;
struct c {
char cha;
struct c *nextPtr;
};
typedef struct c Character;
void push(Character **headPtr, char c) {
Character *newC = malloc(sizeof(Character));
if(newC == NULL) {
puts("Insufficient memory.");
return;
}
newC->cha = c;
newC->nextPtr = *headPtr;
*headPtr = newC;
}
char pop(Character **headPtr) {
if(*headPtr != NULL) {
Character *tempPtr = *headPtr;
char c = (*headPtr)->cha;
*headPtr = (*headPtr)->nextPtr;
free(tempPtr);
return c;
}
}
void isPalindrome(int stringLength, int charNum) {
if(!isPal) return;
static Character *stack = NULL;
if(charNum < (stringLength/2)) {
char c = getchar();
push(&stack, c);
isPalindrome(stringLength, charNum+1);
} else if(stringLength % 2) {
getchar();
}
char d = getchar();
char e = pop(&stack);
if(d != '\n' && d != e) isPal = 0;
}
int main() {
int n;
if(scanf("%d", &n) != 1 || n < 0) {
puts("Incorrect input.");
return 0;
}
while(getchar()!='\n');
if(n>1) isPalindrome(n, 0);
if(isPal) puts("Palindrome.");
else puts("Not palindrome.");
return 0;
}
推荐阅读
- python - 同时运行kivy和无限循环
- javascript - D3.JS点击事件问题,使用svg map
- json - Golang - Ristretto Cache 返回 base 64
- git - Git 推送和拉取不适用于 Visual Studio Code 1.62.1
- node.js - NodeJS 和 Express 后端的多队列系统设计
- javascript - 使用 Vanilla JS(Chrome 扩展),您如何检测 React 页面是否已完全加载其所有组件?
- mongodb - Mongodb:更新数组内的对象
- java - H2文件模式还是TCP模式更稳定?
- html - CSS 网格布局调整大小
- python - 如何使用 tf 和 keras 为 U_Net 分割模型保存测试数据集中每个图像的名称?