【发布时间】:2018-02-10 06:31:44
【问题描述】:
MultipleStack 是一个支持多个堆栈的类,但将它们的所有值存储在单个一维数组中。 push(item, k) 将 item 推入 k 堆栈。为了正确执行此操作,该类存储了一个数组top,该数组存储了每个堆栈的最顶部元素的索引。 push 应该在推送 item 之后将 top[k - 1] 增加一,以便正确推送以下项目。但是,有时push 将top[k - 1] 增加了两个,我无法弄清楚为什么。
#include <cassert>
class MultipleStack {
int * _s;
size_t * _top;
size_t _nStacks, _size;
public:
MultipleStack(size_t nStacks, size_t size) {
_nStacks = nStacks;
_size = size * nStacks;
_s = new int[size];
_top = new size_t[nStacks];
//Simply sets top = {0, 10, 20, ...} no error here
for (size_t i = 0; i < nStacks; i++) {
_top[i] = (_size / _nStacks) * i;
}
}
//This is the buggy method
void push(int item, size_t k) {
size_t beforeSet = _top[k - 1];
_s[_top[k - 1]] = item;
size_t afterSet = _top[k - 1];
assert(beforeSet == afterSet); // Fails when beforeSet = 14
_top[k - 1] = _top[k - 1] + 1;
}
static void testImplementation() {
//Both, nStacks and size, must be >= 9
int nStacks = 10;
int size = 10;
MultipleStack ms(nStacks, size);
for (int i = 1; i <= nStacks; i++) {
for (int j = 0; j < size; j++) {
ms.push(1, i);
}
}
}
};
int main(int argc, const char * argv[]) {
MultipleStack::testImplementation();
return 0;
}
对于冗长的代码示例,我深表歉意。我尽可能多地剥离,但我无法进一步简化它。
【问题讨论】:
-
使用调试器逐行执行代码时,您观察到了什么?