0

Stack両面を使用するクラス、つまり 2 つのスタックを 1 つにまとめたクラスを作成しました。から[0]まで[someplace - 1]1 つと から[capacity-1]まで1 つ[someplace +1]

すべて問題ありませんが、アレイがいっぱいのときにメモリを 2 倍にすることに問題があります。私のコードは最初は 2 倍に機能しますが、さらに 2 倍にする必要がある場合、奇妙なエラーが発生します。

_ctrlvalidHeappointer

クリティカル セクション エラー

これは私のコードです。コードにもいくつかの説明があります。スタックにあまりにも多くの要素をプッシュすると失敗します。

    string firstname = "asasasasasaasasasasassasasasaasas";
    string secondname= "asasdasfregeasasasasasgergergererg";
        for (int i = 0; i < firstname.length(); i++)
        {
            a.push_at_first(firstname.at(i));
        }
        for (int i = 0; i < secondname.length(); i++)
        {
            a.push_from_end(secondname.at(i));
        }

私のクラスです

using namespace std;
template <class T>
class Stack{
public:
    Stack();
    ~Stack();
    Stack(const Stack<T>& ob);
    void double_size();
    void push_at_first(T mydata);
    void push_from_end(T mydata);
    T & operator = (Stack<T> ob);
private:
    int top;
    int top2;
    T * stack;
    int capacity;
};
template <class T>
T& Stack<T>::operator = (Stack<T> ob)
{
    if(capacity == ob.capacity){
        top = ob.top;
        top2 = ob.top2;
        for (int i = 0; i < capacity; i++)
        {
            stack[i] = ob.stack[i];
        }
        return *this;}
    else
    {
        capacity = ob.capacity;
        stack = new T[capacity];
        for (int i = 0; i < capacity; i++)
        {
            stack[i] = ob.stack[i];
        }

    }
}


template <class T>
Stack<T>::Stack (const Stack<T>& ob) :capacity(ob.capacity)
{
    
    stack = new T[capacity];
    top = ob.top;
    top2=ob.top2;
    for (int i = 0; i < capacity; i++)
    {
        stack[i] = ob.stack[i];
    }
}
template <class T>
 Stack<T>::~Stack()
  {
delete [] stack;
   }
template <class T>
Stack<T>::Stack()
{
    capacity = 17;
    top = 0;
    top2 = capacity-1;
    stack = new T[capacity];
}
template <class T>
void Stack<T>::push_at_first(T mydata)
{
    if ( (top + 1) == (top2 -1) ) //  1 : because I want to Be a Empty Space between Two Stack so i can tell the difference
        double_size();
    stack[++top] = mydata;
}

template <class T>
void Stack<T>::push_from_end(T mydata)
{
    if( (top + 1) == (top2 -1) ) //  1 : because I want to Be a Empty Space between Two Stack so i can tell the difference
        double_size();
    stack[--top2] = mydata;
}

    
template <class T>
void Stack<T>::double_size()
{
Stack<T> temp(*this);
capacity *= 2;
stack = new T[capacity];
top = temp.top;
top2 = capacity - (temp.capacity - temp.top2);// capacity - number of data in stack of temp ;

// if we have something in first stack then copy 0 to top elements of temp.stack to stack
if(top > 0)
{
    for (int i = 0; i <= top ; i++)
    {
        stack[i] = temp.stack[i];
    }
}
// There is Something Wrong Down here ! i can't figure out what !
if(top2 < capacity - 1)
{
    for (int i = capacity-1; i >= top2; i--)
    {
        stack[i] = temp.stack[i-(temp.capacity)];
    }
}

}

4

1 に答える 1

0

いくつかの問題があります。

  1. コピー コンストラクターと代入演算子がありません。

  2. 要素のデストラクタを明示的に呼び出しています。これは自動的に行われるため、再度実行
    すると問題が発生します。delete

  3. temp.stackin に適切な量のメモリを割り当てていませんdouble_size。のプライベート メンバーにアクセスできる場合でも、tempそれ自体で管理できるようにする必要があります (上記のコピー コンストラクターを参照)。(ところで: その変数は不要です。古いメモリ ブロックから新しいメモリ ブロックにコピーしてから、古いブロックを削除し、新しいブロック ポインタを に割り当てますstack。)

  4. のインデックス作成にも問題がある可能性がありますがdouble_size、最初にこれら 3 つの問題を修正する必要があります。

于 2013-05-07T13:55:16.583 に答える