使用堆栈检查字符串是否为回文 #包括 #包括 #包括 #包括 类型定义结构节点 { 字符数据; 结构节点*链接; }堆栈节点; void insertData(StackNode**); void push(StackNode**,char); 作废检查数据(StackNode**); bool-pop(StackNode**,char*); 已发送字符[20]=“”; void main() { StackNode*stackTop; 插入数据(&stackTop); 检查数据(&stackTop); printf(“\n”); 返回; } void insertData(StackNode**stackTop) { 字符c; 内伦; printf(“输入句子”); 而(((c=getchar())!='\n')) { 如果((c>='a'&&c='a'&&c='a'&&cdata=c; pNew->link=*stackTop; *stackTop=pNew; } 无效检查数据(StackNode**stackTop) { 字符c; int i=0; while(pop(堆叠顶部和c)) { 如果(c!=已发送[i++]) { printf(“非回文”); 返回; } } printf(“回文”); } bool pop(StackNode**stackTop,char*c) { StackNode*pNew; pNew=*stackTop; if(pNew==NULL) 返回false; *c=pNew->data; *stackTop=pNew->link; printf(“char poped%c\n”,*c); 免费(pNew); 返回true; }

使用堆栈检查字符串是否为回文 #包括 #包括 #包括 #包括 类型定义结构节点 { 字符数据; 结构节点*链接; }堆栈节点; void insertData(StackNode**); void push(StackNode**,char); 作废检查数据(StackNode**); bool-pop(StackNode**,char*); 已发送字符[20]=“”; void main() { StackNode*stackTop; 插入数据(&stackTop); 检查数据(&stackTop); printf(“\n”); 返回; } void insertData(StackNode**stackTop) { 字符c; 内伦; printf(“输入句子”); 而(((c=getchar())!='\n')) { 如果((c>='a'&&c='a'&&c='a'&&cdata=c; pNew->link=*stackTop; *stackTop=pNew; } 无效检查数据(StackNode**stackTop) { 字符c; int i=0; while(pop(堆叠顶部和c)) { 如果(c!=已发送[i++]) { printf(“非回文”); 返回; } } printf(“回文”); } bool pop(StackNode**stackTop,char*c) { StackNode*pNew; pNew=*stackTop; if(pNew==NULL) 返回false; *c=pNew->data; *stackTop=pNew->link; printf(“char poped%c\n”,*c); 免费(pNew); 返回true; },c,string,stack,palindrome,C,String,Stack,Palindrome,我可以弹出每个字母,在exe文件不工作之后,我想我无法检查字母是否按相反顺序相同。请帮助 我花了一整天的时间来编写这个程序,但我现在已经陷入困境。你可以使用隐式调用堆栈吗 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> typedef struct node { char data; struct node *link;

我可以弹出每个字母,在exe文件不工作之后,我想我无法检查字母是否按相反顺序相同。请帮助


我花了一整天的时间来编写这个程序,但我现在已经陷入困境。

你可以使用隐式调用堆栈吗

#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;
}
int是pal(常量字符*开始,常量字符*结束)
{
如果(*开始!=*结束)
返回0;
如果((结束-开始)<2)
返回*开始==*结束;
返回为_pal(开始+1,结束-1);
}

我不知道您为什么要这样做,但这是一种方法

把所有的东西都堆起来

然后从一开始就将所有内容与字符串的元素进行比较

对于(int i=0;i 对于(int i=0;i继续;

在C中编程时,您应该始终初始化指向NULL的指针。因为您没有初始化
堆栈节点*stackTop
(在main中)它指向垃圾并且不是空的。因此,当你检查回文时,你的pop方法会一直离开堆栈的末尾,并且永远不会返回false,因为它从来没有碰到空值。
StackNode*stackTop=null;
应该可以解决你的问题。

我不确定我是否得到了“使用棍子”的提示part…!?@H2CO3,stick->stack。如果你想批准它,有一个待定的编辑。@CarlNorum啊,谢谢,是的……你为什么要使用堆栈?@Sukunt,因为我正在学习堆栈:)非常感谢!!这对我很有帮助。我会永远记住你说过的话。@user2509877不客气。同样,你应该将malloc返回给你的内存设置为0。
pNew=(StackNode*)malloc(sizeof(StackNode));memset(pNew,0,sizeof(StackNode))
另外,想想如果有人输入超过20个字符会发生什么情况。你不是在检查输入是否适合
发送的
数组。你可能想检查插入数据中
len
小于20的while循环。只要记住C允许你用内存做任何你想做的事情,所以你必须注意不要覆盖正在用于其他用途的内存,也不要覆盖内存中实际存在的内容(即,如果您希望它为空或null,则为空)。“在C中编程时,您应该始终将指针初始化为null”-我不能恰好同意这一点。它没有那么简单。@H2CO3您能详细说明一下吗?
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);
}