我一直在做一本书的练习。我坚持这个qustion的含义。假设您在stac上存储整数值,并且使用静态数组存储数据提供了createStack()deleteStack(堆栈)方法。
我的解释是
typedef struct {
int values;
char data[50];
} StackData;
typedef struct n {
StackData d; // store some data in node
struct n *successor; // store successor of node
// as typedef is not yet completed
// name StackNode cannot be used
} SatckNode;
typedef struct {
StackNode *head;
StackNode *current;
} Stacklist;
我知道这些不是方法。但我想知道我是否正确地采取行动
答案 0 :(得分:0)
我认为你是在正确的方式 - 只是几个评论。
在Stacklist
中,我不明白为什么你有指向堆栈中两个节点的指针。
通常,堆栈仅保留对堆栈顶部项目的引用。
另外,它们要么保持堆栈有多大的计数器,要么指向堆栈底部节点的指针(这可能是head
的意思),并引用头部节点{{1 }}?)。
并且不要忘记在创建任何这些结构时初始化所有内容:P通常会在无休止的头痛时间内结束。
保持良好的工作。
答案 1 :(得分:0)
如果您使用静态数组作为值,那么您在技术上不需要createStack()
和deleteStack()
函数,因为您只需创建struct stack
或者堆叠中的任何东西(双关语)并且你已经完成了。
但是,如果您确实想要(并且您可能合法地希望,例如避免必须显式初始化top
,或者隐藏在opaque类型后面的实现,或者能够从一个没有复制潜在大型数组的函数)这样做:
#include <stdio.h>
#include <stdlib.h>
#define STACKSIZE 50
typedef struct stack * Stack;
struct stack {
size_t top;
int values[STACKSIZE];
};
Stack createStack(void)
{
Stack new_stack = malloc(sizeof *new_stack);
if ( !new_stack ) {
perror("couldn't allocate memory");
exit(EXIT_FAILURE);
}
new_stack->top = 0;
return new_stack;
}
void deleteStack(Stack stack)
{
free(stack);
}
void push(Stack stack, const int n)
{
if ( stack->top < STACKSIZE ) {
stack->values[stack->top++] = n;
}
else {
fprintf(stderr, "Stack full - exiting.\n");
exit(EXIT_FAILURE);
}
}
int pop(Stack stack)
{
if ( stack->top > 0 ) {
return stack->values[--stack->top];
}
else {
fprintf(stderr, "Stack empty - exiting.\n");
exit(EXIT_FAILURE);
}
}
int main(void)
{
Stack mystack = createStack();
push(mystack, 3);
push(mystack, 1);
push(mystack, 4);
push(mystack, 1);
push(mystack, 5);
for ( size_t i = 0; i < 5; ++i ) {
printf("Popped %d from stack.\n", pop(mystack));
}
deleteStack(mystack);
return 0;
}
现在你似乎想要一个带有静态数组值的堆栈,但是你开始为节点和列表定义结构,就像你想要一个链表实现一样。这两种实现方式明显不同。