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