【问题标题】:C++ Stacks with multiple values具有多个值的 C++ 堆栈
【发布时间】:2012-04-22 22:34:50
【问题描述】:

我在下面有一些代码。这段代码是一个基本的 push/pop 堆栈类,我创建它作为模板,使某人能够 push/pop 堆栈。我有一个家庭作业,我现在要做的是创建一个具有多个值的堆栈。

所以我希望能够创建一个基本上可以发送三个整数的堆栈,并且我也可以在其中推送/弹出这些整数。我正在寻找的是关于这应该如何工作的理论,我并不是想找人为我做功课。

场景是我们正在处理零件。所以用户将输入序列号(int)、制造日期(int)和lotnum(int)。所以我的问题是:

  1. 当我“弹出”值时,我应该尝试在弹出期间发送所有三个值还是以其他方式处理?
  2. 我应该尝试使用类或其他结构之类的结构创建一个新类吗?

    /****************************************************************************
    Inventory class.
    
    Chad Peppers
    
    This class creates a object for stacking nodes
    
    In addition, there should be member functions to perform the following 
    operations:
    - Push to the stack
    - Pop to the stack
    - Function to check if empty
    
    ****************************************************************************/
    // Specification file for the DynIntStack class
    
    template <class T>
    class Inventory
    {
    private:
       // Structure for stack nodes
       struct StackNode
       {
          T value;        // Value in the node
          StackNode *next;  // Pointer to the next node
       };
    
       StackNode *top;      // Pointer to the stack top
    
    public:
       // Constructor
       Inventory()
          {  top = NULL; }
    
       // Destructor
       ~Inventory();
    
       // Stack operations
       void push(T);
       void pop(T &);
       bool isEmpty();
    }; 
    
    /*************************************************************************
    Basic class constructor.
    
    Input Parameters:  Information to build the  stack
    
    Return Type:  void
    
    *************************************************************************/
    
    template<class T>
    Inventory<T>::~Inventory()
    {
       StackNode *nodePtr, *nextNode;
    
       // Position nodePtr at the top of the stack.
       nodePtr = top;
    
       // Traverse the list deleting each node.
       while (nodePtr != NULL)
       {
          nextNode = nodePtr->next;
          delete nodePtr;
          nodePtr = nextNode;
       }
    }
    
    /*************************************************************************
    Function to push an item in the stack
    
    Input Parameters:  T
    
    Return Type:  void
    
    *************************************************************************/
    
    template<class T>
    void Inventory<T>::push(T num)
    {
       StackNode *newNode; // Pointer to a new node
    
       // Allocate a new node and store num there.
       newNode = new StackNode;
       newNode->value = num;
    
       // If there are no nodes in the list
       // make newNode the first node.
       if (isEmpty())
       {
          top = newNode;
          newNode->next = NULL;
       }
       else  // Otherwise, insert NewNode before top.
       {
          newNode->next = top;
          top = newNode;
       }
    }
    
    /*************************************************************************
    Function to pop an item in the stack
    
    Input Parameters:  T
    
    Return Type:  void
    
    *************************************************************************/
    template<class T>
    void Inventory<T>::pop(T &num)
    {
       StackNode *temp; // Temporary pointer
    
       // First make sure the stack isn't empty.
       if (isEmpty())
       {
          cout << "The stack is empty.\n";
       }
       else  // pop value off top of stack
       {
          num = top->value;
          temp = top->next;
          delete top;
          top = temp;
       }
    }
    
    /*************************************************************************
    Basic class deconstructor.
    
    Input Parameters:  None
    
    Return Type:  void
    
    *************************************************************************/
    template<class T>
    bool Inventory<T>::isEmpty()
    {
       bool status;
    
       if (!top)
          status = true;
       else
          status = false;
    
       return status;
    }
    

【问题讨论】:

  • 您可以通过仅使用 return (!top) 来简化您的 isEmpty()。
  • 您还可以通过使用 push(const T&) 来节省推送。在这种情况下,您不会在调用此函数时构造临时值。

标签: c++ templates stack


【解决方案1】:

您可以创建一个由 3 个 int 值聚合而成的结构,然后在这些行上为该结构实例化模板 Inventory

#include "Inventory.h"
//create an aggregate structure
struct ProductData {
   int serial_num;
   int manufacture_date;
   int lot_num;
}

//instantiate Inventory for ProductData

Inventory<ProductData> stack;

【讨论】:

  • 这听起来不错,让我试试看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2016-05-28
相关资源
最近更新 更多