使用堆栈检查字符串是否为回文结构

时间:2013-06-21 17:40:27

标签: c string stack palindrome

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

我整天都在努力写这个程序,但我现在已经陷入困境。

3 个答案:

答案 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())       继续;