如何有效地破坏队列

How to destroy a queue efficiently?

本文关键字:队列 有效地      更新时间:2023-10-16

我实现了我自己的队列数据结构。我使用单向链接列表实现了队列。它是在类定义中实现的。链接列表的头部指向队列的正面,链接列表的尾巴指向队列的末端。请注意,我只保留了尾巴以在o(1(时间中进行推动操作。

现在,类的推动功能会动态分配一个值的内存,然后将其推到列表的末尾。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(1(中的队列?

如果您打算继续使用链接列表。o(n(是破坏链接列表(或任何基于节点的数据结构(的最佳渐近复杂性。

也不会用非平凡的破坏者存储对象。您不能在恒定时间内致电n个破坏者。

如果您选择其他数据结构来实现队列,则可能。如果元素在易于破坏的情况下,动态生长的阵列(即向量(可以在恒定时间内被破坏。

如何实现STL队列的驱动器?它会摧毁O(1(还是O(n(中的整个队列?

std::queue只是较低级容器的包装器。它的破坏者只是摧毁了您选择的基础容器。复杂性是该容器破坏者的复杂性是什么。o(n(对于任何具有非平凡破坏者的对象容器,以及所有std::dequestd::list,o(1(的 std::vector,用于带有琐碎的驱动器的元素。

在这里,复杂性是根据对free的调用或与内存相关的任何内容来表达的。free本身的复杂性可能不能保证是恒定的。