1

わかりました、まずメソッドを書き、事前にstackoverflowを検索し、私のアイデアがほとんどの人が行った方法と一致していることに気付きましたが、スタックは実際には逆になりませんが、代わりに奇妙な値が入れられます:

私はこのようにやっています: 補助スタックと条件サイズ != 0 の while ループを作成し、pop メソッドも削除された要素を返すため、aux.push(pop()) を呼び出します。 O(n) 時間の複雑さで逆にする必要があります。しかし、これは起こります:

反転するスタック: ACDF -> 結果: Đ Đ `

メモリリークテスターを実行したところ、すでに解放されているスペースを4回解放しようとしたので、それが原因であると考えています。

詳細:

動的配列として実装されたスタック

関連する関数を含むコードは次のとおりです。

template<typename T>
bool NizStek<T>::push(const T& element){

if(_size == _capacity) increaseCapacity();
if(_size == 0){

    _brojE++;
    _top++;
    _array[_top] = new T(element);

}
else{

    _size++;
    ++_top;
    _array[_top] = new T(element);

}


}

ポップ機能:

template<typename T>
T NizStek<T>::pop(){

if(_size == 0) throw "Stack is empty";
T oldTop = *_array[_top];

delete _array[_top];
_top--;
_size--;

return oldTop;
}

逆機能:

 template<typename T>
 void NizStek<T>::reverse() {

NizStek<T> aux;
while(size() != 0){

    aux.push(pop());
}

*this = aux;
}

COPY CONSTRUCTOR(OPERATOR = は最初の行が delete[] _array; であることと同じです)

 template<typename T>
 NizStek<T>::NizStek(const NizStek& rhs){

_size = rhs._size;
_capacity = rhs._capacity;

_niz = new T*[_capacity];

for(int i=0; i<_size ;i++) _array[i] = rhs._array[i];

_top = rhs._top;
}

前もって感謝します!

4

1 に答える 1