作为一项任务,我必须迭代地而不是递归地实现快速排序。在这样做时,我需要使用堆栈。在这种情况下使用堆栈与单独或双向链接列表有什么好处?
答案 0 :(得分:2)
简单的回答是表达力。正如在注释中指出的那样,您可以使用链表实现堆栈。关于"使用堆栈"的好处是你不必担心实施的细节。也就是说,如果您刚刚使用了链接列表,那么您可以使用以下内容:
// push onto the stack
newNode = createStackNode(myData);
newNode.Next = root;
root = newNode;
// pop from stack
poppedNode = root;
root = root.Next;
myData = poppedNode.data;
如果您使用现有的Stack
数据结构,那么您不必担心推送和弹出的细节。你要写的只有:
theStack.push(myData);
或
myData = theStack.pop();
重点是您知道Stack
数据结构有效。拨打push
或pop
的电话真的很难。 非常容易搞砸了添加内容并从链接列表的头部删除内容的代码。
答案 1 :(得分:0)
堆栈是一个接口,它定义了一组应该定义的操作,它可以通过链接列表,双链表,数组等多种方式实现(如果需要,也可以使用队列,即使我不建议这样做)。这组操作的定义限制了数据结构的范围,允许为特定用例获得更好的性能。
一般来说,要从链接列表或数组中删除元素需要O(n)
,因为要删除的元素可以处于任何位置,因此您必须先找到它。在堆栈中,使用相同的数据结构实现pop
,您可以实现O(1)
,因为您已经知道要删除的元素在哪里(如果链接列表和最后一个元素,则它是头部如果是数组)。
答案 2 :(得分:-1)
Push具有O(1)并且Pop在堆栈中具有O(1)时间复杂度,而Inserting可能具有O(N)(如果添加到头部,则最好的情况发生,O(1))并且搜索具有O( N)在linkedList中。由于您需要执行添加和反向操作,因此使用LinkedList
会更昂贵