Performance 实现给定堆栈的最有效方法

Performance 实现给定堆栈的最有效方法,performance,stack,Performance,Stack,我心中有一个堆栈规范---> *可以查看具有最高(或最低)值的对象。 *堆栈上的每个对象都是可比较的 我希望尽快实施以下操作 无效推力(E) 无效pop(E) E)中间元素();[size()/2)+1] E peek highestelement() E peekLowestElement() int size() 效率必须是中心。推荐的方法是什么?欢迎提出意见 编辑:所有要经常调用的方法。此外,重要的是时间效率。效率太笼统了,尤其是在面对6种方法时?CPU效率?内存占用?每个函数调用的次数是

我心中有一个堆栈规范---> *可以查看具有最高(或最低)值的对象。 *堆栈上的每个对象都是可比较的

我希望尽快实施以下操作

  • 无效推力(E)

  • 无效pop(E)

  • E)中间元素();[size()/2)+1]

  • E peek highestelement()

  • E peekLowestElement()

  • int size()

  • 效率必须是中心。推荐的方法是什么?欢迎提出意见


    编辑:所有要经常调用的方法。此外,重要的是时间效率。

    效率太笼统了,尤其是在面对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):

    使用值e创建新节点X++s如果(s==1)设置H=T=M=X并设置links,否则{在H处附加X;设置H=X;如果M在这种情况下,数组实现将是理想的,尽管我不确定您的描述是否仍然可以称为堆栈。在实现它时需要注意以下几点:

  • 按数组的右端键。如果超出数组容量,可以分配一个新数组,复制所有元素并删除以前的分配。所有这些都由大多数语言中的一些基于数组的容器类自动处理。但是,在扩展时,有一些方法可以避免大部分复制堆栈的容量可能会导致其他操作的效率降低

  • 如果您维护一个索引来标记下一次插入(即push(e)),则pop()的实现可以简单到“-;”

  • peekMiddle()将只是第(size/2)个索引上的元素。我希望您不是在寻找中间值

  • 对于peekLowest(),简单的解决方案是保持一个最小值堆栈,即当您将一个值推到堆栈上时,如果它是新的最小值,则也将其推到最小值堆栈上。这样,最小值堆栈上的最高值将是peekLowest()的答案当然,当您从原始堆栈中弹出一个值时,如果它是最小值(如peekLowest()所示),也可以从最小值堆栈中弹出它。peekHighest()也可以使用类似的方法


  • 通过这个简单的实现,您应该能够获得所有操作的O(1)运行时间是摊销后的运行时间。

    所有方法都要经常调用。此外,重要的是时间效率。仅时间效率?将其作为一个数组来实现。顺便说一句,如果必须遵守堆栈规则-->“您只能看到堆栈的顶部”@jsshah写道:PeekMiddle:它将始终是数组[0]