动态堆栈与静态数组C

时间:2014-11-29 14:03:56

标签: c

我一直在做一本书的练习。我坚持这个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;

我知道这些不是方法。但我想知道我是否正确地采取行动

2 个答案:

答案 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;
}

现在你似乎想要一个带有静态数组值的堆栈,但是你开始为节点和列表定义结构,就像你想要一个链表实现一样。这两种实现方式明显不同。