0

スタック クラスの関数を書くのに苦労operator==しています。ロジックを理解できないようです。現在私は持っています:

template<class myType>
bool linkedStack<myType>::operator==(const linkedStack<myType>& op)
{
    linkedStack<myType> stackA, stackB;
    bool res = false;
    stackA.copyStack(this);
    stackB.copyStack(op);

    while(!stackA.isStackEmpty() && !stackB.isStackEmpty())
    {
        if (stackA.peek() == stackB.peek()) {
            stackA.pop();
            stackB.pop();
            if (stackA.isStackEmpty() && stackB.isStackEmpty())
                res = true;
        } else
            res = false;
    }
    return res;
}

問題は、現在のクラス スタックを stackA にコピーできないことです。これthisは const ポインターであり、copyStack がコンパイラ エラーを吐き出すためです。これにはもっと簡単な解決策が必要です。誰かが私を正しい方向に向けることができますか? ありがとう!

編集:私のコードの改訂された部分:

template<class myType>
bool linkedStack<myType>::operator==(const linkedStack<myType>& op)
{
    nodeType<myType> *current, *opcurrent;
    current = stackTop;
    opcurrent = op.stackTop;

    while(current != NULL && opcurrent != NULL)
    {
        if (current->info != opcurrent->info) {
            return false;
        }
        current = current->link;
        opcurrent = opcurrent->link;
    }
    return true;
}
4

3 に答える 3

1

違いを発見したら、すべてのスタックを調べる必要はありません。その時点で false を直接返すことができます。

while(!stackA.isStackEmpty() && !stackB.isStackEmpty())
{
    if (stackA.peek() == stackB.peek()) {
        stackA.pop();
        stackB.pop();
    } else
        return false;
}
return stackA.isStackEmpty() && stackB.isStackEmpty();

より一般的な注意として、クラス内から操作している場合は、コピーを作成するのではなく、クラスの内部データを直接使用することもできます (スタックに保持されているすべてのデータのコピーも発生します)。内部リストをたどるには、いくつかのポインターを使用する必要があります。このコードは、次の行に沿って何かを与えるはずの上記のコードから簡単に派生できます。

node *a_ptr = head_ptr;
node *b_ptr = op.head_ptr;
while(!(a_ptr == tail || b_ptr == tail)
{
    if (a_ptr->data == b_ptr->data) {
        a_ptr = a_ptr->next;
        b_ptr = b_ptr->next;
    } else
        return false;
}
return (a_ptr == tail && b_ptr == tail);

実装の詳細に応じて。

于 2013-04-25T03:15:58.690 に答える
1

最初に比較メソッドを呼び出すと、呼び出されているオブジェクトが変更されません。それを宣言しconstます。

次に、スタックが非常に大きいとパフォーマンスの問題が発生する可能性があるため、このようにオブジェクトをコピーすることはお勧めできません (一般的な使用法を想定しています)。

しかし、最も重要なのは、これがスタックの実装である場合、このようにパブリック メソッドを呼び出す代わりに、内部データを使用しないのはなぜでしょうか?

たとえば、Microsoft の STD は、スタックの内部データ表現として両端キューを使用し、operator==単純に次のように定義されています。

template<class _Ty,
    class _Container> inline
    bool operator==(const stack<_Ty, _Container>& _Left,
        const stack<_Ty, _Container>& _Right)
    {   // test for stack equality
    return (_Left._Get_container() == _Right._Get_container());
    }
于 2013-04-25T03:16:51.460 に答える
0

thisとの両方のローカル コピーを作成していopます。これは不要で、代わりにthisとのデータを直接比較できます。opconst オブジェクトを非 const パラメータを取る関数に渡そうとしているようです。copyStackconst 参照またはポインターを取る必要があります。

于 2013-04-25T03:21:41.327 に答える