#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct node
{
char data;
struct node *link;
}StackNode;
void insertData(StackNode **);
void push(StackNode **, char);
void checkData(StackNode **);
bool pop(StackNode **,char *);
char sent[20] = "";
void main()
{
StackNode *stackTop;
insertData(&stackTop);
checkData(&stackTop);
printf("\n");
return;
}
void insertData(StackNode **stackTop)
{
char c;
int len;
printf("Enter the Sentence\n");
while( ( ( c = getchar() ) != '\n'))
{
if( ( ( c>='a' &&c<='z') || (c>='A' && c<='Z')))
{
if((c>='A' && c<='Z'))
{
int rem;
rem = c-'A';
c='a' + rem;
}
push(stackTop,c);
len = strlen(sent);
sent[len++]=c;
sent[len]='\0';
}
}
printf("Letters are %s\n\n",sent);
}
void push(StackNode **stackTop,char c)
{
StackNode *pNew;
pNew = (StackNode*) malloc(sizeof(StackNode));
if(!pNew)
{
printf("Error 100:Out of memory\n");
exit(100);
}
pNew->data = c;
pNew->link = *stackTop;
*stackTop = pNew;
}
void checkData(StackNode **stackTop)
{
char c;
int i=0;
while(pop(stackTop,&c))
{
if( c !=sent[i++])
{
printf("Not palindrome");
return;
}
}
printf("Palindrome");
}
bool pop(StackNode **stackTop,char *c)
{
StackNode *pNew;
pNew = *stackTop;
if(pNew == NULL)
return false;
*c = pNew->data;
*stackTop = pNew->link;
printf("char poped %c\n",*c);
free(pNew);
return true;
}
我能够弹出每个字母,之后exe文件不起作用,我想我无法检查字母是否以相反的顺序相同。请帮忙
我整天都在努力写这个程序,但我现在已经陷入困境。
答案 0 :(得分:2)
您是否可以使用隐式调用堆栈?
int is_pal(const char *begin, const char *end)
{
if (*begin != *end)
return 0;
if ((end - begin) < 2)
return *begin == *end;
return is_pal(begin + 1, end - 1);
}
答案 1 :(得分:1)
在C语言编程时,你应该始终将指针初始化为NULL 。因为你没有初始化StackNode *stackTop
(在main中)它指向垃圾并且不是null。因此,当你检查回文时,你的pop方法只是继续离开堆栈的末尾并且永远不会返回false,因为它永远不会返回null。 StackNode *stackTop = NULL;
应该解决您的问题。
答案 2 :(得分:0)
我不确定你为什么要这样做,但这是一种方式
把所有东西放在堆栈上
然后从头开始将所有内容与字符串元素进行比较。像这样的东西
for(int i = 0; i&lt; strlen(s); i ++) 推(S [1]);
for(int i = 0; i&lt; strlen(s); i ++) if(s [i] == pop()) 继续;