MultipleStack
是一個支持多個堆棧的類,但將其所有值存儲在單個一維數組中。 push(item, k)
將item
推到k
堆棧上。爲了正確執行此操作,類將存儲一個數組top
,該數組存儲每個堆棧中最頂層元素的索引。 push
在推入item
之後,應該將top[k - 1]
增加1,以便正確推送下列項目。但是,有時,push
增加了top[k - 1]
兩個,我無法找出原因。C++數組值隨機增加一個
#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;
}
對於冗長的代碼示例,我表示歉意。我儘可能多地剝離,但我無法簡單地進一步。
當你用調試器逐行執行代碼時,你觀察到了什麼? – user0042