堆栈上的所有值是否小于传递值?

时间:2013-10-22 08:18:41

标签: c++ templates c++11 stack

我正在完成一个Stack程序,并且不确定如何制定一个方法来确定Stack上的所有值是否小于传递的值。

因此,例如,对于包含top-(1)(1)(2)(3)(5)(5)(2)的堆栈,allSmallerThan(3)应该返回false,因为堆栈上的值更大另一方面,对于包含top-(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 个答案:

答案 0 :(得分:3)

由于您的元素未在堆栈中排序,您必须像printStack(...)一样手动遍历它们并自行检查值。

您可以在第一次出现时中止不小于给定值。

答案 1 :(得分:2)

循环堆栈的所有值。如果其中一个值不小于参数,则返回false。如果循环结束,则所有值都较小,因此返回true。

答案 2 :(得分:1)

类似的东西:

 template <class Object>
        int Stack<Object>::allSmallerThan( const Object & data ) const{
        if (isEmpty()) {
            outs << "Empty Stack";
        }
        else {
            StackNode<Object> * node = topNode;
            while (node != NULL) {
                 if (node >= data) //You need to do the comparison by hand
                  return (false);
                node = node->getNext();
            }
        }
        return( true );
     }

答案 3 :(得分:0)

最终工作

   template <class Object>
    int Stack<Object>::allSmallerThan( const Object & data ) const{
        if (isEmpty()) {
            throw EmptyStack();
        }
        else {
            StackNode<Object> * node = topNode;
            while (node != NULL) {
                if (data <= node->getElement()) //You need to do the comparison by hand
                    return (false);
                node = node->getNext();
            }
        }
        return( true );
    }