【发布时间】:2017-04-21 07:56:29
【问题描述】:
我实现了自己的队列数据结构。我使用单向链表实现了队列。它是在类定义中实现的。链表的头指向队列的前端,链表的尾指向队列的尾。请注意,我保留尾部只是为了在 O(1) 时间内完成推送操作。
现在类的 push 函数为一个值动态分配内存,然后将其推送到列表的末尾。并且pop函数释放分配给前面的值的内存。
当队列被破坏(超出范围)时,我想释放分配的内存,所以我为队列编写了一个析构函数。我的析构函数遍历整个链表并删除链表的每个元素。时间复杂度为 O(n)。有什么办法可以降低队列的时间复杂度?是否可以在 O(1) 中销毁队列?如果我只释放了链表的头,链表的其余元素不会被删除,并且由于头被删除,链表的其他元素将无法删除。 STL队列的析构函数是如何实现的?它会在 O(1) 或 O(n) 中破坏整个队列吗?
my_queue 的析构函数代码如下:
/*
Node is a struct which is the nodes of the linked list.
It has two attributes: val(of type char) and next(of type node*)
*/
my_queue :: ~my_queue(){
node * temp;
while(head != NULL){
temp = head;
head = head->next;
delete temp;
}
sz = 0;
tail = NULL;
}
【问题讨论】:
-
如果你使用链表,我认为 O(N) 是你能得到的最好的。如果您通过类似于
std::vector的方式实现它,您可以获得 O(1) 的推送和弹出摊销以及 O(1) 的免费。 -
@Winestone 对于任何非平凡的 value_type,向量破坏将是 O(N)。如果你有 n 个对象,你需要 n 次调用析构函数。
-
@juanchopanza 你说得对,我假设有
int的队列。 -
可以在O(1)中清除vector
吗? -
我认为它需要像一个免费电话一样长,这需要像this很多时间
标签: c++ c++11 memory-management linked-list queue