0

对于我的课程,我被要求创建一个 Stack 类,将其元素存储在 STL 容器(但不是 STL 堆栈容器)中。

要求:

  • 必须能够存储任意类型的元素
  • 只要系统有足够的空闲内存,每个实例都接受插入
  • 必须在命名空间 cop4530 中
  • 必须使用下面头文件中显示的大多数方法和运算符重载(不是 back()、+=op、[]ops)
  • 方法/函数等在 .h 中声明,并在单独的 .hpp 中实现

然后,我将堆栈与我创建的另一个程序一起使用,该程序将中缀符号算术更改为后缀,并在所有元素都可比较时对其进行评估。

我的教授给出了一个示例头文件,如下所示。

他为什么使用双端队列指针?我搜索并发现了许多人们将 STL 容器适应堆栈的情况,但从未将 STL 容器解释为指向堆栈。如果有的话,有人可以解释一下使用非指针的好处吗?示例帮助

示例 .h 声明文件

#ifndef COP4530_STACK_H
#define COP4530_STACK_H

#include <iostream>
#include <deque>

namespace cop4530
{

template <typename T>
class Stack;

//----------------------------------
//     Stack<T>
//----------------------------------

template <typename T>
class Stack
{
public:
  // Constructor, Copy-constructor and destructor
  Stack  ();
  Stack  (const Stack<T>&);
  Stack  (Stack<T> &&);
  ~Stack (); 

  // member operators
  Stack<T>& operator =  (const Stack<T>&);
  Stack<T> & operator=(Stack<T> &&);
  Stack<T>& operator += (const Stack<T>&);
  const T&         operator [] (int) const;
  T&               operator [] (int);

  // other methods
  int   size        () const;
  int   capacity    () const;

  // Container class protocol
  bool         empty     () const;
  void         clear     ();
  void         push      (const T&);
  void         push      (T &&);
  void         pop       ();
  T&           top       ();
  const T&     top       () const;
  T&           back      ();


  // Display methods 
  void print    (std::ostream& os, char ofc = ' ') const;

protected:
  std::deque<T>  *mystack;   // pointer to the stack.
//std::deque<T>   mystack;   //WHY NOT THIS???

} ;

// operator overloads
template < class T >
std::ostream& operator << (std::ostream& os, const Stack<T>& a);

template < class T >
bool      operator == (const Stack<T>&, const Stack<T>&); 

template < class T >
bool      operator != (const Stack<T>&, const Stack<T>&); 

template < class T >
bool      operator <= (const Stack<T>&, const Stack<T>&);

#include "stack.hpp"

}   // namespace cop4530
#endif

示例 .hpp 实现

#ifndef COP4530_STACK_HPP
#define COP4530_STACK_HPP

//----------------------------------------
//     Stack<T>:: Implementations
//----------------------------------------

// operator overloads

    template <typename T>
std::ostream& operator << (std::ostream& os, const Stack<T>& s)
{

}

    template <typename T>
bool operator<=(const Stack<T>& s1, const Stack<T>& s2)
{

}

    template <typename T>
bool operator == (const Stack<T>& s1, const Stack<T>& s2)
{

}

    template <typename T>
bool operator != (const Stack<T>& s1, const Stack<T>& s2)
{

}

// public methods

    template <typename T>
Stack<T>::Stack()
    //Constructor
{

}

    template <typename T>
Stack<T>::Stack(const Stack<T>& source)
    //Copy-constructor
{

}


template <typename T>
Stack<T>::Stack(Stack<T> && source)
{

}
    template <typename T>
Stack<T>::~Stack()         
    // destructor
{

}

    template <typename T>
Stack<T>& Stack<T>::operator = (const Stack<T>& source) 
    // assignment operator
{

}

template <typename T>
Stack<T>& Stack<T>::operator = (Stack<T> && source)
{

}

    template <typename T>
Stack<T>& Stack<T>::operator += (const Stack<T>& source) 
{

}

template <typename T>
const T& Stack<T>::operator [] (int i) const                 
// element operator
{

}

    template <typename T>
T& Stack<T>::operator [] (int i)
    // element operator
{

}

template <typename T>
bool Stack<T>::empty() const
{

}

template <typename T>
int Stack<T>::size() const
{

}

    template <typename T>
void Stack<T>::push(const T& Val)
{

}

template <typename T>
void Stack<T>::push(T && Val)
{

}

    template <typename T>
void Stack<T>::pop()
{

}

    template <typename T>
void Stack<T>::clear()
{

}

template <typename T>
T&  Stack<T>::top()
{

}

template <typename T>
const T&  Stack<T>::top() const
{

}

template <typename T>
T&  Stack<T>::back()
{

}

template <typename T>
void Stack<T>::print(std::ostream& os, char ofc) const
{

}

#endif
4

0 回答 0