如何检查C ++中的两个堆栈是否相同?

时间:2012-10-12 17:36:49

标签: c++ stack

我正在使用堆栈,需要检查两个是否相同。我已经超载了

bool operator== 

在我的代码中运行,现在我需要将逻辑放在代码中。我将检查一些事情,看看两个堆栈是否相同:长度,数据类型和每个元素的内容。长度和内容都没有问题,它的数据类型给我带来了问题。

我试图创建一个函数:

...
    Type getType();
};

template <class Type>
Type getType(){ returnType;}

但这不起作用。

我也想过:

bool operator== (stack<Type> &lhs, stack<Type> &rhs){

    return (lsh.Type == rhs.Type);
//additional conditions will be checked.
}

如何检查它们是否属于同一类型?

编辑:如果我只检查了两个堆栈顶部元素的数据类型怎么办?那就够了吗?

5 个答案:

答案 0 :(得分:8)

如果您实施operator==,请执行以下操作:

template<typename Type>
bool operator== (const stack<Type> &lhs, const stack<Type> &rhs){
    // compare and return.
}

您已经知道两个堆栈都包含相同类型的元素。没有必要检查它。

如果要允许比较使用不同模板参数的堆栈,可以执行以下操作:

template<typename Type1, typename Type2>
bool operator== (const stack<Type1> &lhs, const stack<Type2> &rhs){
    // compare
}

然后使用operator==比较元素,您将完成。当然,如果类型operator==Type1的参数没有Type2,那么编译器将发出错误。

编辑:既然你想要一个很好的错误信息,你可以这样做(使用C ++ 11):

#include <type_traits>

template<typename Type1, typename Type2>
bool operator== (const stack<Type1> &lhs, const stack<Type2> &rhs){
    // This is a compile time assert!
    static_assert(std::is_same<Type1, Type2>::value, "Types are not equal!");
    // compare
}

无论如何我都会避免这种情况。让编译器发出自己的错误更简单,而不是自己做这个检查。

答案 1 :(得分:6)

C ++与其他(动态)语言不同,因为您不需要检查类型。如果两个堆栈包含不同的类型,则在尝试比较它们时,代码将无法编译。换句话说,跳过这一步,编译器将为您完成。

答案 2 :(得分:2)

如果使用 templates (例如template <typename T> class Stack...)实现堆栈数据结构,那么您只需要重载operator==并检查大小并进行逐项比较:

template <typename T>
bool operator==(const Stack<T> & lhs, const Stack<T> & rhs)
{
  if (lhs.Size() != rhs.Size())
    return false;

  // Compare item by item
  ...
}

C ++编译器类型系统将隐式检查该类型(如果您有Stack<int>并尝试与Stack<string>进行比较,则会出现编译器错误。)

答案 3 :(得分:0)

正如您在stackoverflow的C ++标记定义中所看到的那样

C++ is a widely-used, statically-typed, free-form, compiled,
multi-paradigm, multi-level, imperative, general-purpose,
object-oriented programming language.

在这个定义中statically-typed意味着所有类型信息在编译时必须是干净的,所以在C ++中如果你想拥有不同类型的容器或者想要比较不同类型的容器,你必须在编译时识别它通过使用模板。

因此,当您比较两种不同类型的容器(此处为堆栈)时,您知道两种容器的类型,并且您不需要比较它们的类型。因此,如果你想要不同类型的容器,它们都应该来自同一个类,这样它们就可以存储为相同类型,或者你必须将它们保存为void*(除非你知道你在做什么,否则这是非常危险的)。如果你从同一个类派生所有类,你可以简单地使基类多态(通过添加至少一个虚函数)并使用typeid来获取对象的类型,或者你可以添加一个虚拟函数进行比较,然后将其专门化每个派生类(甚至你可以混合使用这两种技术)但是在void*的情况下你必须有另一种方法来识别对象的类型!

答案 4 :(得分:0)

我找到了一个简单的程序来解决您的目的,它是一种简单而非常有效的方法来检查两个堆栈是否相等。

  bool isEqual(stack<Type> &stack1, stack<Type> &stack2) {
    if (stack1.empty() && stack2.empty())
      return true;
    else if (stack1.empty() || stack2.empty())
      return false;
    while (!stack1.empty() && !stack2.empty())
    {
      if (stack1.top() != stack2.top())
        return false;
      stack1.pop();
      stack2.pop();
    }
    if (stack1.empty() && stack2.empty())
      return true;
    else
      return false;
  }
相关问题