我首先要说这不是一个作业问题。我正在阅读算法简介-著名的CLRS文字,以成为更好的程序员。我正在尝试解决本书中自己提出的问题和练习。
我试图解决锻炼; Tibial 10.1-2从第10章基本数据结构从CLRS第二版。其状态如下:
说明如何在一个数组A [1..n]中实现两个堆栈,除非两个堆栈中的元素总数为n,否则两个堆栈都不会溢出。PUSH和POP操作应在O(1)时间中运行。
到目前为止,我想出的解决方案是:
让数组A [1..n]实现两个堆栈:S1 [1..i]和S2 [i..n]。
对于PUSH-S1和PUSH-S2操作,如果堆栈“已满”,则开始将元素推入另一个堆栈(例如,当尝试将新元素推入时,如果堆栈S1已满,则将该元素推入堆栈S2,反之亦然)。
这种方法的问题是我将无法可靠地进行POP-S1或POP-S2,因为无法“记住”哪个元素属于哪个堆栈。如果堆栈的元素是(键,值)对,键是堆栈号,那么要弹出一个元素,在最坏的情况下,我必须搜索i或(ni)次-这将是O(n )(如果我在这里错了,请随时纠正我),它不是O(1)。
我已经在这个问题上花了很长时间了。我在正确的轨道上吗?有人可以给我解决该问题的可能指示吗?
通常,我应该如何“思考”这些问题?还是只有真正有才智的人才能解决这类问题?解决/解决此类问题(例如获得经验)是否可以帮助我变得更好?
我在等待启蒙。