主代码本身运行良好,但我想使用字符串而不是字符,这可能是因为我忽略了一些简单得离谱的东西。下面是一小段代码:
struct Stack
{
char *SData;
int counter;
struct Stack *next;
};
struct Stack* StackNewNode(char SData)
{
struct Stack *stackNode = (struct Stack*)malloc(sizeof(struct Stack));
stackNode->SData = SData; //error here because of the difference of char, should i use []?
stackNode->next = NULL;
return stackNode;
}
void PUSH(struct Stack **root, char SData) //this part only pushes a character
{
struct Stack *stackNode = StackNewNode(SData);
stackNode->next = *root;
*root = stackNode;
printf("n%c pushed to stackn", SData);
}
void POP(struct Stack **root)
{
if (*root == NULL)
{
return;
}
struct Stack *temp = *root;
*root = (*root)->next;
char pop = temp->SData; //how should i pop a full string?
free(temp);
printf("%c popped from stackn", pop);
}
我还想在Stack中实现一个计数器。我应该使用Stack->counter++
还是有其他更正确的方法?
对不起,这是我第一次来这里
在您提供的代码片段中,struct Stack
中的counter
没有被使用。假设您想要对堆栈中的元素数量进行计数,那么将该值作为结构的一部分是没有意义的。毕竟,您只需要一个计数,而不需要将一个计数附加到堆栈中的每个元素。您可能希望将其作为自己的变量,也许是在定义根的同一位置定义的全局变量。只需确保将其初始化为零即可。
至于使用字符串,您已经有了char *SData
,它可以指向字符串。您所需要做的就是将PUSH和StackNewNode更改为使用char*
参数而不是char
,然后向其传递一个字符串,类似于以下内容:
PUSH(&root, "My string");
从当前代码开始,这里有一些类型不匹配:stackNode->SData = SData;
stackNode->SData
是字符指针,SData
是字符。我想你的编译器会警告你这一点——永远不要忽视警告。
如果你想使用C型字符串,你需要更新如下:
-
传递char指针而不是char
-
为字符串分配内存
-
将传递的字符串复制到分配的内存
-
完成后释放内存
类似于:
struct Stack
{
char *SData;
int counter;
struct Stack *next;
};
struct Stack* StackNewNode(const char* str)
{
struct Stack *stackNode = malloc(sizeof(struct Stack));
if (stackNode == NULL) exit(1);
stackNode->SData = malloc(strlen(str) + 1);
if (stackNode->SData == NULL) exit(1);
strcpy(stackNode->SData, str);
stackNode->next = NULL;
return stackNode;
}
void PUSH(struct Stack **root, const char* str)
{
struct Stack *stackNode = StackNewNode(str);
stackNode->next = *root;
*root = stackNode;
printf("n%s pushed to stackn", str);
}
void POP(struct Stack **root)
{
if (*root == NULL)
{
return;
}
struct Stack *temp = *root;
*root = (*root)->next;
printf("%s popped from stackn", temp->SData);
free(temp->SData);
free(temp);
}
用法示例:
struct Stack *root = NULL;
PUSH(&root, "Hello World");
添加计数器
在代码中,您已将int counter;
放置在每个堆栈元素中。你可以做到,但我更喜欢两个结构。一种结构类型保存有关整个堆栈的信息,另一种结构为元素类型。
类似:
struct StackNode
{
char *SData;
struct StackNode *next;
};
struct Stack
{
int counter;
struct StackNode *root;
};
功能需要一些更新,如:
void PUSH(struct Stack *stack, const char* str)
{
struct StackNode *stackNode = StackNewNode(str);
stackNode->next = stack->root;
stack->root = stackNode;
++stack->counter; // Increment counter
printf("n%s pushed to stackn", str);
}
用法示例:
struct Stack stack = {0, NULL};
PUSH(&stack, "Hello World");