0

在这里,我正在检查它是否是回文。我在学习堆栈的过程中这样做。

有没有办法我可以使用指针而不是 char 数组“发送”,以便在以下代码中输入字符的数量不必限制为 20?代码运行良好,但在性能或其他方面是否应该有任何改进?在使用堆栈时我应该记住的指针有什么重要的吗,比如将其初始化为 NULL?谢谢

#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;
   stackTop = NULL;
   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;
}
4

2 回答 2

0

在 C 中,数组实际上是指向静态分配内存的指针。创建指向数组或数组中任何元素的指针非常简单。例如,假设我们有一个数组,char sent[20].如果我们想创建一个指向与发送的完全相同的内存的指针,我们可以声明char *sentP = sent. 我们现在可以替换任何使用sentwith sentP。我们甚至可以创建一个指向 sent: 中间的指针char *sentMidP = sent + 9。现在,sentMidP[0]sent[9]sentMidP[-9]是一样的sent[0].

但是,与 不同sent的是,我们可以更改 wheresentPsentMidPpoint (将其sent视为常量指针char * const,您无法更改)。因此,如果您有另一个数组char sent2[100]'. You can set the value ofsentP tosent2 . What's cool about this is that you can do it *at runtime*, which effectively means that you can change the size ofsentP`,具体取决于输入的大小。

但是,没有必要将自己限制为静态分配的输入。C 提供了在运行时分配内存的malloc函数(参见此处)。因此,如果您在编译时不知道句子的大小,但您会在运行时知道它(比如在一个名为 的变量中sentenceLength),您可以像下面这样分配 `sentP'。

char *sentP = malloc(sizeof(char) * (sentenceLength + 1)); // Plus one for the NUL termination byte in C strings
if (sentP == NULL) {
     fprintf(stderr, "No more memory :(");
     exit(EXIT_FAILURE);
 }

请注意我们现在必须如何处理内存不足错误。一般来说,动态分配会引入更多开销,因为我们可能会耗尽内存,要求我们确保只访问分配的内容,并且需要在free完成后释放内存。

完成sentP指针后,请务必使用以下命令释放它:

free(sentP);

而已!您可以使用sentP我们在您的代码中创建的指针,一切都应该很好。祝你好运!

于 2013-06-25T19:52:36.480 回答
0

据我所知,没有办法拥有“无限数组”或没有限制的数组。但是,如果您使用,malloc您可以产生足够大的内存部分,您无需担心这些限制。我稍后在您使用 malloc 的代码中看到了这一点,所以我假设您知道它是如何工作的。但是,我会使用这样的东西;

char * sent = malloc(sizeof(char) * 100);
if(sent == NULL){
     printf("OUT OF MEMORY!");
     return 1;
}

其中 100 是您希望拥有的缓冲区大小。我使用了最大 10000 的大小并且在运行时没有问题,所以这可能是您需要的。

于 2013-06-24T21:29:37.450 回答