以下代码是堆栈实现的一部分,通过链表在 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/