1
#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 文件不起作用,我想我无法检查字母是否以相反的顺序相同。请帮忙

我一直在工作一整天来编写这个程序,但我被困在这一点上。

4

3 回答 3

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);
}
于 2013-06-21T17:50:19.707 回答
1

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

于 2013-06-21T18:17:38.663 回答
0

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

把所有东西都放在堆栈上

然后从一开始就弹出与字符串元素进行比较的所有内容。像这样的东西

for(int i = 0; i < strlen(s); i++) push(s[i]);

for(int i = 0; i < strlen(s); i++) if (s[i] == pop()) 继续;

于 2013-06-21T17:53:24.530 回答