Performance 实现给定堆栈的最有效方法
我心中有一个堆栈规范---> *可以查看具有最高(或最低)值的对象。 *堆栈上的每个对象都是可比较的 我希望尽快实施以下操作Performance 实现给定堆栈的最有效方法,performance,stack,Performance,Stack,我心中有一个堆栈规范---> *可以查看具有最高(或最低)值的对象。 *堆栈上的每个对象都是可比较的 我希望尽快实施以下操作 无效推力(E) 无效pop(E) E)中间元素();[size()/2)+1] E peek highestelement() E peekLowestElement() int size() 效率必须是中心。推荐的方法是什么?欢迎提出意见 编辑:所有要经常调用的方法。此外,重要的是时间效率。效率太笼统了,尤其是在面对6种方法时?CPU效率?内存占用?每个函数调用的次数是
编辑:所有要经常调用的方法。此外,重要的是时间效率。效率太笼统了,尤其是在面对6种方法时?CPU效率?内存占用?每个函数调用的次数是否相同?堆栈平均有多大
总的来说,我认为一个单独的链表是一个好主意,假设
size
和peekMidElement
不经常被调用(这似乎是合理的)。一种方法是使用数组实现堆栈。但是,这对堆栈中的元素数量施加了限制(即数组的最大大小受到限制)。此外,您可能需要为数组分配空间(如果数组的大小越来越大,您可以使用realloc魔术来重新增加数组的大小)
数组实现的优点是。。。您必须跟踪堆栈顶部的一个变量。中间的peek只是数组的索引
希望这有帮助
Push:top变量表示数组中的索引,其中top元素是。。。在推的时候。。。只需将值存储在top之后的下一个元素(当然是在进行限制检查之后)。。然后可以增加top的值
波普:减量顶部。。。返回(顶部+1)处的值
PeekMiddle:它将始终是数组[top/2]
最高:它将始终是数组[top]
PeekMiddle:它将始终是数组[0]
尺寸:返回顶部
以上所有操作都是O(1)如果您知道堆栈大小的良好上限,那么使用数组(如另一个答案中所述)可能是合理的做法。所有六个操作都是O(1),如果堆栈经常在其最大大小附近运行,则每个元素的存储是最佳的 另一方面,如果您不知道堆栈大小的上限,或者如果堆栈大小通常比上限小,则使用双链接列表,如下所述。同样,所有六个操作都是O(1)。如果堆栈的大小接近最小值,则每个元素的存储是最佳的——您不会有太多未使用的阵列空间。注意,下面显示为“new”和“free”的内存分配可以由malloc()和free()调用组成,也可以是通过使用可用节点池来限制开销的常用方法 让H指向列表的顶部,T指向列表的尾部,M指向列表的中部。(每次更改可以在时间O(1)内保持M,如下所示。)初始化列表大小s=0,中间计数M=0 对于您的操作1-6:
使用值e创建新节点X++s如果(s==1)设置H=T=M=X并设置links,否则{在H处附加X;设置H=X;如果M在这种情况下,数组实现将是理想的,尽管我不确定您的描述是否仍然可以称为堆栈。在实现它时需要注意以下几点:
通过这个简单的实现,您应该能够获得所有操作的O(1)运行时间是摊销后的运行时间。所有方法都要经常调用。此外,重要的是时间效率。仅时间效率?将其作为一个数组来实现。顺便说一句,如果必须遵守堆栈规则-->“您只能看到堆栈的顶部”@jsshah写道:PeekMiddle:它将始终是数组[0]