使用Stack类实现List类

时间:2016-07-17 12:36:22

标签: c++ c++11 language-design

我正在尝试编写像Python这样的解释编程语言,所以我需要一个List类来存储'函数和变量的地址'。我实现了Stack类来实现List类:

typedef unsigned int UIntegerP; //This type for storing addresses
#define Free 0x0

template <typename T> class Stack{ 
    public:
        unsigned long UsedBSize; // You can use that like End Of Stack (EOS)

        Stack(void){
            this->BSize = 0; this->UsedBSize = 0;
            this->Buffer = new T;           
        }
        ~Stack(void){
            delete this->Buffer;
        }

        inline void Push(T Variable){ 
            if(this->UsedBSize == this->BSize){ 
                this->BSize++; 
            } this->Buffer[this->UsedBSize] = Variable; this->UsedBSize++;
        }    
        inline T Pop(bool IsProtected = false){ 
            if(IsProtected){
                return this->Buffer[this->UsedBSize]; 
            }else{
                this->UsedBSize--; T Element = this->Buffer[this->UsedBSize]; this->Buffer[this->UsedBSize] = Free; 
                return Element;
            }   
        }   
    private:
        T *Buffer;
        unsigned long BSize; 

};

这是我要实施的课程:

class List{
    private:
        Stack<UIntegerP> *stack = new Stack<UIntegerP>; //A stack for storing variable addresses

    public:
        ~List(void){
            delete this->stack;
        }

        List(Stack<UIntegerP> Elements){ 
            while(Elements.UsedBSize != 0){
                this->stack->Push(Elements.Pop());
            }
        }

        List(Stack<UIntegerP> *Elements){
           while(Elements->UsedBSize != 0){
               this->stack->Push(Elements->Pop());
           }
        }

        UIntegerP Get(unsigned long Size); //Get Address with Index number
        UIntegerP Set(unsigned long Size, UIntegerP Address); //Set Address with Index number
};

我将使用此List类来实现像字典一样的Python。 Variable类需要UIntegerP类型。我如何实现这两个功能?

1 个答案:

答案 0 :(得分:1)

假设您的堆栈仅公开了PushPop函数,那么您就无法有效地实现带有索引的列表。

如果您使用正常的C ++样式进行编程,那么基本数据结构将是dynamic arraylinked list。然后,您可以在这些堆栈之上构建堆栈。但请注意,链表中的索引编制速度很慢(线性时间复杂度)。

如果你以函数式编程,那么基本结构是&#34; list&#34 ;,这是一个不可变的单链表,它实际上与不可变栈相同。但同样,使用它进行索引的速度会很慢。

另请注意,您的Stack实施不正确:您为单个T分配内存,但之后您认为可以将其用于无限数量的T秒。您需要转到链接列表路由:为每个项目分配一个新节点并使用指针连接节点;或者你需要去动态数组路由:分配一个特定大小的数组,当它变得太小时,重新分配它。