【问题标题】:Remove element at a given index of a Stack that is a part of linked list of stacks删除作为堆栈链接列表一部分的堆栈的给定索引处的元素
【发布时间】:2015-07-16 22:34:02
【问题描述】:

我正在构建一个 StackList。这是 StackNodes 的链表。 StackNode 上的每个堆栈的大小都是恒定的(它是一个 int 数组)。如果堆栈已满,我使用 malloc 创建一个新的 StackNode 并将其附加到 StackList。

我需要实现一个函数调用

int popAt(int index);

它应该返回由索引指定的元素。

场景:
每个堆栈的长度 = 10;
StackList 共有 5 个堆栈。因此,我的 StackList 中的元素数量是每个堆栈 10 * 5 个集合 = 41 - 50(最多可以是 50)。我想删除索引 = 25 处的元素。这意味着它位于我的 StackList 的第 2 个 StackNode 和该 StackNode 堆栈中的第 4 个索引处。当我删除第 25 个元素时,我需要将它上面的每个元素向下推一个元素。

我的解决方案:

Copy elements on 2nd stack that is above 24th element one position down.
do {
    Copy next StackNode->stack's first element to the end of Current stacks
    //Problem here
    select next StackNode
} while ( linked list has StackNodes)

问题:
我想将堆栈中的所有元素向下移动一个位置。是否可以在不遍历数组(每个 StackNode 上的堆栈)的情况下执行此操作,因为如果我有 n 个 StackNode,那么我需要遍历 n * 堆栈大小。即如果我的 3ed 堆栈从 0x8000 开始,那么实际上数据从 0x8004 开始,因为我删除了第一个元素并将其附加到第二个堆栈的末尾。所以我需要将值 0x8004 设置为 0x8000,依此类推,直到 0x8028 设置为 0x8024,然后继续对所有其他堆栈执行此操作。有没有比使用 for 循环移动每个元素更好的解决方案。我知道函数 memcpy 但由于内存地址重叠,我不确定传入是否是个好主意

memcpy(0x8000, 0x8004, 9) //assume my stack size is 10;

注意:

链表是由以下结构定义的 StackNode 类型

struct StackNode {
    int* stack;
    StackSet* nextStack;
    StackSet* previousStack;
}

希望我足够清楚:) 谢谢。

【问题讨论】:

  • 为什么你不使用std::stack 而不是自己滚动?
  • 请不要将您的问题同时标记为cc++,因为两种语言的答案会大不相同
  • 1.选择一种语言 - 您使用的是 C 还是 C++? 2.如果你用的是C,那么realloc可能会好用吗?
  • 我知道 std:stack 但问题是关于实现我自己的堆栈列表。我确信 C++ 也没有。我正在准备面试,遇到了这个问题。这就是为什么我在我的解决方案和我面临的问题之前写下这个问题。不过感谢您的帮助。我更改了标签以更好地反映问题。
  • "我知道函数 memcpy,但由于内存地址重叠,我不确定它是否是个好主意" -- 这就像说你知道氰化物是有毒的,但你不确定它是否是个好主意吃它。来自 memcpy 手册页:“内存区域不得重叠。如果内存区域重叠,请使用 memmove(3)。” -- 你不明白哪一部分?

标签: c data-structures stack


【解决方案1】:

你是对的,如果内存区域重叠,memcpy() 将不起作用。

对于这种情况,存在一个不同的函数,memmove()。它与memcpy() 的工作方式相同,但包含处理重叠内存区域的额外检查。

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 2021-08-06
    • 2013-11-07
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2021-01-05
    • 2012-02-15
    • 2013-06-10
    相关资源
    最近更新 更多