MultipleStack
は、複数のスタックをサポートするクラスですが、すべての値を単一の1次元配列に格納します。 push(item, k)
はitem
をk
スタックにプッシュします。これを正しく行うために、クラスはすべてのスタックの一番上の要素のインデックスを格納する配列top
を格納します。 push
は、item
を押した後にtop[k - 1]
を1つ増やして、次の項目が正しくプッシュされるようになっています。しかし、ときどき、push
がtop[k - 1]
を2つ増やしてしまい、その理由を理解できません。C++配列の値が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;
}
長いコードサンプルについてお詫び申し上げます。私はできる限り多くを取り除きましたが、私はそれ以上のことはできませんでした。
デバッガでコードを1行ずつステップ実行する際に、何を観察しましたか? – user0042