2

スタック プログラムを完成させている途中で、スタック上のすべての値が渡された値よりも小さいかどうかを判断するメソッドを作成する方法がわかりません。

たとえば、top- (1) (1) (2) (3) (5) (5) (2) を含むスタックの場合、スタックに 3 より大きい値があるため、allSmallerThan( 3 ) は false を返す必要があります。一方、トップ (1) (1) (2) (3) (5) (5) (2) を含むスタックの場合、スタック上のすべての値がより小さいため、allSmallerThan( 12 ) は true を返す必要があります。 12.

運営の署名をしました

int Stack<Object>::allSmallerThan( const Object & data ) const; 

しかし、その後、私はどこに行くべきか少し困惑しています

以下は完全な実装ファイルです。ファイルの大部分は私たちに渡され、特定の操作を完了するように求められました。特にこれは致命的です

#ifndef STACK_CPP
#define STACK_CPP

#include "Stack.h"

namespace cs20 {

template <class Object>
Stack<Object>::Stack() {
    topNode = NULL;
}

template <class Object>
Stack<Object>::Stack( const Stack<Object>& rhs ) {
    topNode = NULL;
    *this = rhs;
}

template <class Object>
Stack<Object>::~Stack() {
    makeEmpty();
    delete topNode;
}

template <class Object>
bool Stack<Object>::isEmpty() const {
    return( (topNode == NULL) );
}

template <class Object>
void Stack<Object>::makeEmpty() {
    while (!isEmpty()) {
        pop();
    }
}
template <class Object>
    int Stack<Object>::allSmallerThan( const Object & data ) const{


    }


template <class Object>
void Stack<Object>::push( const Object& data ) {
    StackNode<Object>* newNode = new StackNode<Object>( data, topNode );
    topNode = newNode;
}

template <class Object>
void Stack<Object>::pop() {
    if (isEmpty()) {
        throw EmptyStack();
    }
    StackNode<Object> *oldTop = topNode;
    topNode = topNode->getNext();
    delete oldTop;
}

template <class Object>
const Object& Stack<Object>::top( ) const {
    if (isEmpty()) {
        throw EmptyStack();
    }
    StackNode<Object> node = *topNode;
    return( node.getElement() );
}

template <class Object>
Object Stack<Object>::topAndPop( ) {
    Object o = top();
    pop();
    return( o );
}

// Deep copy of linked Stack
template <class Object>
const Stack<Object>& Stack<Object>::operator =( const Stack<Object>& rhs ) {
    if (this != &rhs) {
        makeEmpty();
        if (!(rhs.isEmpty())) {
            StackNode<Object> * rhsTopNode = rhs.topNode;
            StackNode<Object> * myTopNode = new StackNode<Object>( rhsTopNode->getElement() );
            topNode = myTopNode;

            rhsTopNode = rhsTopNode->getNext();
            while (rhsTopNode != NULL) {
                myTopNode->setNext( new StackNode<Object>( rhsTopNode->getElement() ) );
                myTopNode = myTopNode->getNext();
                rhsTopNode = rhsTopNode->getNext();
            }
        }
    }
    return( *this );
}

template <class Object> 
std::ostream& Stack<Object>::printStack( std::ostream& outs ) const {
    if (isEmpty()) {
        outs << "Empty Stack";
    }
    else {
        outs << "TOP: ";
        StackNode<Object> * node = topNode;
        while (node != NULL) {
            outs << node->getElement();
            outs << "\n     ";           /// for visual alignment
            node = node->getNext();
        }
    }
    return( outs );
}

}

#endif

よろしくお願いします!

4

4 に答える 4

3

要素はスタック上でソートされていないため、のように手動でトラバースしprintStack(...)、自分で値を確認する必要があります。

指定された値よりも小さくない最初の出現で中止できます。

于 2013-10-22T08:21:42.160 に答える
2

スタックのすべての値をループします。いずれかの値が引数より小さくない場合は、false を返します。ループが終了すると、すべての値が小さくなるので true を返します。

于 2013-10-22T08:23:07.950 に答える