【问题标题】:What is the best data structure for removing an element from the middle?从中间删除元素的最佳数据结构是什么?
【发布时间】:2012-01-17 19:53:56
【问题描述】:

数据结构必须像堆栈。只有一个区别。我不仅想从任何索引中弹出。当我弹出元素n 时,索引为N > n 的元素必须交换为N-1。有什么想法吗?

附:

  1. 将元素n 推入堆栈的最后一个索引。
  2. 然后将其弹出。
  3. 然后删除stack[n]

是个坏主意。

【问题讨论】:

  • 任何时间复杂度限制?
  • 我这辈子从来没有想要一个链表。你分析过你的代码吗?

标签: c++ stack


【解决方案1】:

我认为您正在寻找一个链表。

【讨论】:

  • 同意,std::list 是正确的选择。但是,如果他有一些未说明的理由更喜欢std::vector,它会起作用,使用std::vector::erase() 来满足他要求的行为。
【解决方案2】:

链表 (std::list) 将允许您从中间移除具有O(1) 复杂性的元素,并自动“拉”出它之后的元素。您可以使用push_front 来使用像堆栈一样的链表。但是,您需要注意访问链表中的元素是O(n),因为您需要从列表的头部开始,然后沿着链接从一个元素走到下一个元素,直到到达元素@987654326 @(所以没有O(1)索引)

基本上你需要

  • 创建迭代器
  • advance 定位到n
  • 从迭代器中获取元素
  • erase 迭代器当前指向的元素

一些示例代码可以在here找到。

【讨论】:

    【解决方案3】:

    你需要实现一个链表,但与数组不同的是,链表中的顺序是由每个对象中的指针决定的。因此,您不能使用索引来访问元素。

    【讨论】:

    • 你不能使用索引,但你有auto iter = std::advance(mylist.begin(), 42);
    猜你喜欢
    • 2021-03-16
    • 2011-02-28
    • 2011-04-09
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2012-04-11
    • 2020-09-18
    相关资源
    最近更新 更多