c++ - 通过 C 中的链表实现的堆栈

标签 c++ data-structures linked-list

以下代码是堆栈实现的一部分,通过链表在 C 中实现。代码是否存在问题?具体来说,在 pop() 方法中,调用者传递一个 void** 参数,因此 pop() 可以分配一个指向顶级节点数据的指针给它。 pop() 随后调用 delete 以释放堆栈的顶部节点,这是 *data 指向的位置。这不会删除应该返回给调用者的指针中的数据,还是我遗漏了什么?

typedef struct Element 
{
    struct Element *next;
    void *data;
} Element;


bool pop( Element **stack, void **data )
{
    Element *elem;
    if (!(elem = *stack)) return false;

    *data = elem->data;
    *stack = elem->next;
    delete elem;
    return true;
}


bool push( Element **stack, void *data )
{
    Element *elem = new Element;
    if(!elem) return false;

    elem->data = data;
    elem->next = *stack;
    *stack = elem;
    return true;
} 

最佳答案

一些想法:

  • 如果您想使用 C 编译器编译它,请使用 malloc() 和 free() 而不是 new 和 delete。这些是 C++ 关键字。
  • 如果您需要一种快速确定堆栈大小的方法,我建议创建一个 Stack 数据结构来保存头指针和尾指针以及堆栈的长度,然后将其传递给您的 push() 和 pop() 函数。最重要的是,您不需要双重指针。
  • 从您的 pop() 函数返回数据指针,并且不要忘记 free() 它(如果需要)。

关于c++ - 通过 C 中的链表实现的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5779276/

相关文章:

c++ - 如何对 map 使用 copy_if

c++ - 如何在 C/C++ 中检查 USB 是否插入或移除

java - 在Java中为堆栈结构创建动态数组

C++ : Confused in dealing with multiple classes

c# - C# 中的斐波那契、二进制或二项式堆?

java - 方法的空指针异常

c++ - 模板调用 : Actual specialization not called

c++ - 如何在成员函数#2 中访问成员函数#1 中的变量?

c - 如何通过在末尾添加节点来创建链表?

c - C 中的内存分段