哨兵与传递计数
Posted
技术标签:
【中文标题】哨兵与传递计数【英文标题】:Sentinel vs. passing around a count 【发布时间】:2014-05-17 08:37:26 【问题描述】:我在 C 语言中有一个结构,其中包含一个数组,我在该数组上执行堆栈操作。
如果堆栈已满,我需要防止将元素压入数组末尾,并返回错误条件。
将堆栈的大小作为结构的一个元素包含在内,并将该数量的元素传递给 stack_push() 函数是否更好,或者我应该在堆栈数组的末尾有一个哨兵元素?
【问题讨论】:
使用大小变量(解释太长,无法评论) 我真的很喜欢阅读一些推理。请随时将其放在答案中,如果我同意推理,我可以接受您的答案。 考虑 C 字符串(以'\0'
结尾的字符数组)和 C++ 字符串(神秘编码 char
,以及可快速检索的长度,并且可能嵌入了 '\0'
)。哪个更通用?哪个比较新?归根结底,这取决于您的目标。一个并不总是比另一个更好。
【参考方案1】:
你打算如何实现你的stack_push()
函数?
如果它需要扫描到数组的末尾以寻找一个空槽来插入推送的元素,那么无论如何你都需要一个标记值(例如,如果数组包含指针元素,则为 NULL)。但请注意,算法将是 O(N)。
另一方面,跟踪数组中活动元素的数量允许您的算法对于推送(以及对于弹出)是 O(1)。它还省去了在数组中分配一个额外元素的麻烦,如果它是一个结构数组,这可能很重要。
一般来说,大多数堆栈数据结构都是使用数组和计数器来实现的。
【讨论】:
【参考方案2】:你会使用什么标记值?当然,你必须确保这个函数的调用者绝对不会使用这个值。如果您的函数在看似合理的输入的标记值处过早停止,则调试可能会非常混乱。
对于像字符串这样的东西,很容易使用 NULL 来终止,因为字符串不应该有零字节。但是,如果您开始在某些地方使用哨兵而不在其他地方使用,那么尝试使用您的代码的开发人员可能会开始感到非常困惑。
我会说使用大小参数,除非有一个非常明确和明显的哨兵选择,甚至可能不会。
【讨论】:
以上是关于哨兵与传递计数的主要内容,如果未能解决你的问题,请参考以下文章