我在C中有一个结构,它包含一个我执行堆栈操作的数组。
如果堆栈已满,我需要阻止将元素推到数组末尾,并返回错误条件。
将堆栈的大小作为结构的元素包含在内并将该数量的元素传递给stack_push()函数是否更好?或者我应该在堆栈数组的末尾有一个sentinel元素?< / p>
答案 0 :(得分:4)
您打算如何实施stack_push()
功能?
如果需要扫描到数组的末尾,寻找一个空插槽来插入推送的元素,那么无论如何都需要一个sentinel值(例如,如果数组包含指针元素,则为NULL)。但请注意,该算法将为O( N )。
另一方面,跟踪数组中活动元素的数量允许您的算法为推送(以及弹出)的O(1)。它还可以省去在数组中分配一个额外元素的麻烦,如果它是一个结构数组,这可能很重要。
一般来说,大多数堆栈数据结构都是使用数组和计数器实现的。
答案 1 :(得分:1)
你会使用什么哨兵价值?当然,您必须确保此函数的调用者绝对不会使用此值。如果你的函数在一个看似合理输入的标记值上提前停止,那么调试可能会非常混乱。
对于像字符串这样的东西,很容易使用NULL来终止,因为字符串永远不应该有一个零字节。但是,如果你开始在某些地方而不是在其他地方使用哨兵,那么对于试图使用你的代码的开发人员来说,它会变得非常混乱。
我会说使用一个大小参数,除非有一个非常明确和明显的哨兵选择,甚至可能不是那么。