2016-07-17 6 views
0

Ich versuche, eine interpretierte Programmiersprache wie Python zu schreiben, also brauche ich eine List-Klasse zum Speichern von 'Adresse von' Funktionen und Variablen. Ich bin für die Umsetzung List-Klasse Stack-Klasse implementiert:Implementieren von List-Klasse mit der Verwendung von Stack-Klasse

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; 

}; 

Und das ist die Klasse i implementieren möchten:

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 
}; 

Ich werde diese List-Klasse verwenden, um wie Wörterbücher Python implementiert. UIntegerP-Typ ist für die Variablenklasse erforderlich. Wie kann ich diese zwei Funktionen implementieren?

+0

Eine Liste ist eine sehr einfache Datenstruktur, eine der grundlegenden und generischen Datenstrukturen. Tatsächlich ist es üblich, eine andere Datenstruktur (wie einen Stapel) aus einer Liste zu erstellen. Es gibt auch andere Gründe, warum ein Stack eine schlechte Wahl für die Basis einer Liste ist, zum Beispiel kann ein Stack nicht wirklich iteriert werden. Wenn Sie eine Liste wünschen, warum nicht die Klasse [Standardbibliothek 'std :: list'] (http://en.cppreference.com/w/cpp/container/list) verwenden? Erfinde das Rad nicht neu. –

+0

Weil ich versuche, das Rad neu zu erfinden. –

+1

Dann versuchen Sie zumindest, es richtig zu machen. :) Erstellen Sie eine Knotenklasse mit 'next' und' prev' Zeigern und verwenden Sie diese als Grundlage für die 'List' Klasse. Dann in der "List" -Klasse einen Zeiger auf den "Kopf" und "Schwanz" der Liste der Knoten. –

Antwort

1

Angenommen, Ihr Stack stellt nur die Funktionen Push und Pop zur Verfügung, dann können Sie die Liste mit Indizierung nicht effizient implementieren.

Wenn Sie im normalen C++ - Stil programmieren, wäre die grundlegende Datenstruktur ein dynamic array oder ein linked list. Sie können dann einen Stapel darüber erstellen. Beachten Sie jedoch, dass die Indizierung in einer verknüpften Liste langsam ist (lineare Zeitkomplexität).

Wenn Sie in einem funktionalen Stil programmieren, dann ist die Grundstruktur "Liste", die eine unveränderliche einfach verknüpfte Liste ist und es ist praktisch das gleiche wie unveränderlichen Stapel. Aber auch hier wird die Indexierung langsam sein.


Beachten Sie auch, dass Ihr Stack falsch implementiert wird: Sie Zuweisung Speicher für einen einzelnen T, aber dann übernehmen Sie, dass für eine unbegrenzte Anzahl von T s nutzen können. Sie müssen entweder die Route der verknüpften Liste wählen: Weisen Sie jedem Element einen neuen Knoten zu und verbinden Sie die Knoten mit Zeigern; oder Sie müssen die dynamische Array-Route gehen: Ordnen Sie ein Array mit einer bestimmten Größe zu, und wenn es zu klein wird, weisen Sie es neu zu.

+0

Wenn ich es nicht neu zuzuteilen, wie kann es ein Problem verursachen? –

+1

@ A.Ite Sie greifen auf Speicher zu, den Sie nicht zugewiesen haben. Das bedeutet, dass der Speicher einem anderen Teil Ihres Prozesses gehört (was zu einem sehr verwirrenden und schwer zu debuggenden Verhalten führt), oder der Speicher könnte überhaupt nicht vom Betriebssystem zugewiesen werden und Ihren Prozess zum Absturz bringen. – svick

+0

Es macht den Prozess hart wie Hölle, ich muss einen Code zum Aufzählen der Funktionen und Variablen, Wörterbücher, Tupel, Listen schreiben ... –

Verwandte Themen