为C中的灵活数据类型项调用堆栈API

时间:2012-10-21 18:21:58

标签: c api stack

这里的问题是为C中的调用堆栈设计API。要压入堆栈的项目可以是不同的大小,范围从1个字节到N个字节(并且可以是它们的混合 - 例如,首先推送一个char,然后推送一个int,然后推送一个struct)。堆栈可以实现为链表或动态数组,没有约束。

我的解决方案: 由于将被推入堆栈的项目的数据类型未知,我认为使用void *指针可能是一个合适的解决方案。

问题: 从工程角度来看,这是实施它的最佳方式吗?有更好的方法吗?请在下面找到我的代码。谢谢!

#include <stdio.h>
#include <stdlib.h> 
#include <stdbool.h>

typedef struct stack_node snode;
struct stack_node{
    snode *next;
    void *data;
};

bool push(snode **top, void* data)
{
    snode *current = (snode*)malloc(sizeof(snode));
    if(!current)
        return false;
    current->data = data;
    current->next = *top;
    *top = current;
    return true;
}

bool pop(snode **top, void **data)
{
    snode* current;
    current = *top;
    if(!current)
        return false;
    *data = current->data;
    *top = current->next;
    free(current);
    return true;
}

int main()
{
    int num=0, i;
    snode* top = NULL;

    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    for(i = 0; i < 10 ; i++ )
    {
        if(!push(&top, &arr[i]))
            printf("error allocating memory\n");
    }
    void *data;
    while(pop(&top, &data))
    {
        printf("popped %d\n", *((int*)data));
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果数据不存在于堆栈中,则使用指针将是一个不错的选择。如果我想从堆栈传递超过4个字节的数据怎么办?指针不是那里最好的选择。在我看来,你应该逐字节地插入数据到堆栈。这意味着unsigned char也是一个不错的选择。