我实现了自己的队列数据结构。我使用单向链表实现了队列。它是在类定义中实现的。链表的头部指向队列的前面,链表的尾部指向队列的末尾。注意,我只保留尾部以在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;
}
答案 0 :(得分:1)
是否可以在O(1)中销毁队列?
如果您打算继续使用链接列表,请不要这样做。 O(n)是破坏链表(或任何基于节点的数据结构)的最优渐近复杂度。
如果您使用非平凡的析构函数存储对象,也不会。你不能在恒定的时间内调用N个析构函数。
如果您选择其他数据结构来实现您的队列,那么也许。如果元素是可以轻易破坏的,则可以在恒定时间内销毁动态增长的数组(即向量)。
如何实现STL队列的析构函数?它是否会破坏O(1)或O(n)中的整个队列?
std::queue
只是一个较低级别容器的包装器。它的析构函数只是破坏你选择的底层容器。复杂性就是容器的析构函数的复杂性。对于任何具有非平凡析构函数的对象的容器,O(n),对于具有普通析构函数的std::deque
元素的所有std::list
或std::vector
,O(1),O(n)。
在这里,根据对free
的调用或者释放内存的任何内容来描述复杂性。 free
本身的复杂性可能无法保证不变。