在两个模板堆栈之上打印单独的数据类型(C ++)

时间:2012-11-12 18:25:46

标签: c++ templates types stack

c ++新手。我目前正在尝试编写一个涉及模板化堆栈的程序,它可以处理两个独立的数据类型,int和Student对象。虽然程序的堆栈逻辑工作正常,但我不知道如何在每个数据类型的堆栈顶部打印值。现在我有两个可能的想法,重载'&lt;&lt;&lt;类的运算符(哪一个,我不确定)或为TopStack()编写重载函数(即template <> int Stack<int>::TopStack() const)。我实现了后者,但不正确。有谁知道最有效的方法是什么?我愿意接受任何建议。

我会发布我的代码的相关部分,以便您可以看到我在说什么。

template <class DataType>
struct StackNode
{
    DataType data;                      // data can be of any type
    StackNode<DataType> *next;          // point to the next node
};

template <class DataType>
class Stack
{

private:
    StackNode<DataType> *top;                                 // point to the top node of the stack
    int maxSize;                                              // maximum stack size
    int numNodes;                                             // number of nodes in the stack


public:
    Stack();                                                  // constructor, create a stack with size 10
    ~Stack();                                                 // destructor

    bool isEmpty() const { return (top == 0); }               // check if the stack is empty
    bool isFull() const { return (numNodes == maxSize); }     // check if the stack is full
    void Push(const DataType &elem);                          // push a node onto the top of the stack
    void Pop();                                               // pop a node from the top of the stack
    int TopStack() const;                                // return data from the top of the stack
};

struct Students
    {
        char lastName[20];               // student's last name
        char firstName[20];              // student's first name
        int IDNumber;                    // student ID #
        Students();                      // constructor
        void PrintStudent();             // print a student's information
    };

void Students::PrintStudent()
{
    cout << "\nID# " << this->IDNumber << " - " << this->lastName << ", "
         << this->firstName << endl;
}

// in main() snippet
// if the user asks for top of stack
case 3:
    if (!intStack)            // I use a boolean to switch the stack being accessed
        sstack.TopStack();    // Student stack
    else if (intStack)
        istack.TopStack();    // Int stack
    break;

1 个答案:

答案 0 :(得分:1)

int TopStack() const;                                // return data from the top of the stack

应该是

DataType TopStack() const;                                // return data from the top of the stack

因为数据类型因堆栈类型而异。

实现了类似的东西:

template<typename DataType>
DataType Stack<DataType>::TopStack() const
{
   Assert(top != nullptr);
   if (top == nullptr)
     return DataType();
   return top->data;
}

但是,你的班级std::stack<T>没有做什么?甚至std::vector<T>(有趣的是,通常比stack更好的堆栈。)

使用Stack<DataType>的代码将知道数据的类型,或者因为它正在与之交谈的变量的类型,或者它本身具有的模板参数。为您的学生班级添加operator<<重载,这样您就可以打印它们而不会跳过任何特殊的箍。

如果您发现超载operator<<太可怕了,您可以编写一个独立的Print函数,intStudent const&重载。