将通用堆栈容器实现为适配器类模板

时间:2014-03-02 19:11:41

标签: c++ arrays data-structures stack

我在数据结构(警察4530)课上遇到了一些麻烦。我需要“将通用堆栈容器实现为适配器类模板”。我的模板和实现在两个不同的文件stack.h和stack.hpp (这是必需的)我想这样做Stack设置为数组,但好像我的老师把我们设置为链接列表,如果我没错? 我只是对如何开始将堆栈设置为数组感到困惑,如果有人可以向我解释(我们有一本非常无用的书)。而我真正需要的只是向我解释一下少数来自“.hpp”的函数,我实现了我的堆栈代码。特别是复制/移动功能。 (如果我做的更好或更容易,那就不同于我正在尝试的那样,请分享)

这是Stack.h;这些是我们需要包含的“Stack类模板”的所有接口

#include <iostream>
#define MAX_SIZE 100

namespace cop4530{

template<typename T>
class Stack{

 private:
 int A[MAX_SIZE];
 int top;

 public:

 Stack();
 ~Stack();
 Stack (const Stack<T>&);
 Stack(Stack<T> &&);
 Stack<T>& operator= (const Stack <T>&);
 Stack<T> & operator=(Stack<T> &&);
 bool empty() const;
 void clear();
 void push(const T& x);
 void push(T && x);
 void pop();
 T& top();
 const T& top() const;
 int size() const;
 void print(std::ostream& os, char ofc = ' ') const;  

}

 //non-member global functions
 std::ostream& operator<< (std::ostream& os, const Stack<T>& a);
 bool operator== (const Stack<T>&, const Stack <T>&);
 bool operator!= (const Stack<T>&, const Stack <T>&);
 bool operator< (const Stack<T>& a, const Stack <T>& b); 

 #include "Stack.hpp"

}

#endif

这是单独的“Stack.hpp”文件,它保存了其中一些的实现。

#include "stack.h"
#include <iostream>

namespace cop4530{

template<typename T>
Stack<T>::Stack(){
//zero argument constructor
}

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

template<typename T>
Stack<T>::Stack(const Stack<T>&){ //copy constructor

}

template<typename T>
Stack<T>::Stack(Stack<T> &&){ //move constructor

}

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

template<typename T>
Stack<T>::Stack<T> & Stack<T>::operator=(Stack<T> &&){
    //move assignment operator=
}

/*does this look right? I don't think so...*/
template<typename T>
void Stack<T>::push(const T& x){ //adds x to the stack, copy version
    insert(begin(), x);
}

template<typename T>
void Stack<T>::push(T && x){ // adds x to the stack, move version
    insert(begin(), std::move(val));
}

1 个答案:

答案 0 :(得分:0)

要将Stack实现为数组的适配器类,您应该从堆栈的基本功能开始。让我们考虑一些基础知识:

  • 构造函数 - 创建了一个空堆栈

  • isFull / isEmpty - 返回true / false,具体取决于堆栈中可用的空间大小。

  • push - 在队列顶部添加一个元素

  • pop - 从队列顶部删除第一个元素

让我们从构造函数开始:当顶部== -1 时,您可以说您的堆栈为空。由于您的数组是静态分配的(您可以考虑在构造函数中为数组动态分配内存),您需要做的就是top =-1并且您自己有一个空堆栈

isFull / isEmpty 现在变得很明显了:

  • isEmpty:return top == -1

  • isFull:return top == MAX_SIZE

PUSH :在堆栈顶部添加一个元素:

    if (!isFull)
    {
       top++;
       A[top] = new_element;
    }

我会让你弄明白其余的;我们的想法是更新堆栈指针顶部,并始终关注您有多少空间。