Schlange bzw. Stack mit einfach und doppelt Verketter Liste



  • Hi @all!

    Ich hoffe ihr könnt mir helfen. Ich bin gerade am lernen und weiß nicht weiter!
    Kann mir jemand sagen wie eine: Schlange bzw. Stack mit einfach und doppelt Verketter Liste
    aus sehen soll. Mit meinen Büchern komm ich nicht weiter.

    Pleace Help Me



  • Hat beides mit dynamischen Datenstrukturen zu tun.

    Eine verkettete Liste ist eine Implementierung einer dynamischen Datenstruktur. Und zwar mit Elementen die jeweils einen Zeiger auf das nächste Element (= Einfach verkettet) oder sowohl einen Zeiger auf das nächste als auch auf das vorherige Element (=Doppelt verkettet) besitzen.

    Ein Stack ist eine dynamische Datnestruktur. Man kann Elemente nur auf den Stack oben drauf legen (push) und auch nur jeweils das oberste Element wieder entfernen (pop).

    MfG SideWinder



  • habt ihr vielleicht nen Beispiel oder so? ich verstehs sonst nicht so ganz.



  • Nein, die Hausübung übernehmen wir nicht 😉

    Wo genau sind denn deine Verständnisschwierigkeiten?

    MfG SideWinder



  • So ist es doch nicht gemeint!
    ich habe bisher eine Schlange mit nem dynamischen Feld erzeugt. Das funzt einwandferei. Aber wenn ich das ganze mit einer verketteten Liste machen soll..weiß ich nicht wie ich anfangen soll? Ich bin mir nicht sicher aber ich denke mir die Methoden sind ja die gleichen nur das Prinzip der einfach verketteten Liste müsste ich ja nur an Stelle des dyn. Feldes oder???
    Ändert sich sonst noch was??

    //Main.cpp

    void main()
    {//Behälter q1 definieren
    Mqueue q1;

    //Ausgabe q1
    cout<<"q1: "; q1.trace( );
    //Drei Elementen anfügen und q1 ausgeben
    q1.enqueue( 1 ); q1.enqueue( 2 ); q1.enqueue( 3 );
    cout<<"\nq1: "; q1.trace( ); cout<<endl;
    //20 Elementen anfügen und entfernen. Entfernte Elemente und q1 ausgeben
    for (int i=0; i<20; i++)
    { q1.enqueue(i);
    int a; q1.dequeue(a); cout<<a<<" ";
    }
    cout<<"\nq1: "<< q1;
    //Definieren Bähälter q2 als Kopie von q1. Ausgeben q2
    Mqueue q2(q1);
    cout<<"\nq2: "<< q2;
    //Veränderung in einem Behälter und beide ausgeben
    int a; q1.dequeue(a); q1.enqueue( 55 );
    cout<<"\nq1: "<<q1; cout<<"q2: "<<q2;
    //Definieren q3 als Vereinigung von q1 und q2
    Mqueue q3;
    q3=q1.verein(q2);
    cout<<"\nq3: "<< q3;

    //------------------------------------------------------------------------------

    //Class.h

    class Mqueue; //Vorwärtsdeklaration
    ostream & operator<<(ostream & out, Mqueue & q);

    class Mqueue
    { public :
    Mqueue();
    void enqueue (int ele );
    void dequeue (int & ele );
    void trace ( void );
    int anzahl ( void );
    bool leer ( void );
    bool voll ( void );
    ~Mqueue();
    Mqueue(const Mqueue & qu);
    Mqueue verein(const Mqueue & p);

    private:
    static const int max=4;
    int anz; //Elementen-Anzahl in Queue
    //int feld[max]; //DS ist stat.Feld
    //int feld[max]; //DS ist stat.Feld
    int len; //Feldgroesse
    int* feld; //DS ist dynam.Feld

    };

    //------------------------------------------------------------------------------

    //2te.cpp

    Mqueue::Mqueue( )
    { anz= 0; len=max;
    feld=new int[len];
    }

    void Mqueue::enqueue( int elem )
    { //Ist Warteschlange voll?
    if( anz == max )return;
    feld[ anz ] = elem;
    anz++;
    }
    void Mqueue::dequeue( int & elem )
    { //Ist Warteschlange leer?
    if( anz == 0 )return;
    elem = feld[0];
    for(int i=0; i<anz-1; i++) feld[i]=feld[i+1];
    anz--;
    }
    void Mqueue::trace(void)
    { cout<<"[ ";
    if(anz>0)
    { for(int i=0; i<anz-1; i++) cout<<feld[i]<< "-->";
    cout<< feld[anz-1];
    }
    cout<<" ]"<<endl;
    }

    ostream & operator<<(ostream & out, Mqueue & q)
    { q.trace(); //q.trace(cout);
    return out;
    }

    Mqueue::Mqueue(const Mqueue & qu)
    { len=qu.len; anz=qu.anz;
    feld=new int[len];
    for (int i=0; i<anz; i++) feld[i]=qu.feld[i];
    }

    Mqueue Mqueue::verein(const Mqueue & p)
    { Mqueue tmp(*this);
    for(int i=0; i<p.anz; i++) tmp.enqueue(p.feld[i]) ;
    return tmp;
    }

    int Mqueue::anzahl ( void ){return 0;}
    bool Mqueue::leer ( void ){if( anz==0)return 1; return 0;}
    bool Mqueue::voll ( void ){if( anz!=0)return 1; return 0;}

    Mqueue::~Mqueue( )
    {
    }

    //------------------------------------------------------------------------------



  • GermanSlayer schrieb:

    //Main.cpp

    void main()
    {//Behälter q1 definieren
    Mqueue q1;

    //Ausgabe q1
    cout<<"q1: "; q1.trace( );
    //Drei Elementen anfügen und q1 ausgeben
    q1.enqueue( 1 ); q1.enqueue( 2 ); q1.enqueue( 3 );
    cout<<"\nq1: "; q1.trace( ); cout<<endl;
    //20 Elementen anfügen und entfernen. Entfernte Elemente und q1 ausgeben
    for (int i=0; i<20; i++)
    { q1.enqueue(i);
    int a; q1.dequeue(a); cout<<a<<" ";
    }
    cout<<"\nq1: "<< q1;
    //Definieren Bähälter q2 als Kopie von q1. Ausgeben q2
    Mqueue q2(q1);
    cout<<"\nq2: "<< q2;
    //Veränderung in einem Behälter und beide ausgeben
    int a; q1.dequeue(a); q1.enqueue( 55 );
    cout<<"\nq1: "<<q1; cout<<"q2: "<<q2;
    //Definieren q3 als Vereinigung von q1 und q2
    Mqueue q3;
    q3=q1.verein(q2);
    cout<<"\nq3: "<< q3;

    //------------------------------------------------------------------------------

    //Class.h

    class Mqueue; //Vorwärtsdeklaration
    ostream & operator<<(ostream & out, Mqueue & q);

    class Mqueue
    { public :
    Mqueue();
    void enqueue (int ele );
    void dequeue (int & ele );
    void trace ( void );
    int anzahl ( void );
    bool leer ( void );
    bool voll ( void );
    ~Mqueue();
    Mqueue(const Mqueue & qu);
    Mqueue verein(const Mqueue & p);

    private:
    static const int max=4;
    int anz; //Elementen-Anzahl in Queue
    //int feld[max]; //DS ist stat.Feld
    //int feld[max]; //DS ist stat.Feld
    int len; //Feldgroesse
    int* feld; //DS ist dynam.Feld

    };

    //------------------------------------------------------------------------------

    //2te.cpp

    Mqueue::Mqueue( )
    { anz= 0; len=max;
    feld=new int[len];
    }

    void Mqueue::enqueue( int elem )
    { //Ist Warteschlange voll?
    if( anz == max )return;
    feld[ anz ] = elem;
    anz++;
    }
    void Mqueue::dequeue( int & elem )
    { //Ist Warteschlange leer?
    if( anz == 0 )return;
    elem = feld[0];
    for(int i=0; i<anz-1; i++) feld[i]=feld[i+1];
    anz--;
    }
    void Mqueue::trace(void)
    { cout<<"[ ";
    if(anz>0)
    { for(int i=0; i<anz-1; i++) cout<<feld[i]<< "-->";
    cout<< feld[anz-1];
    }
    cout<<" ]"<<endl;
    }

    ostream & operator<<(ostream & out, Mqueue & q)
    { q.trace(); //q.trace(cout);
    return out;
    }

    Mqueue::Mqueue(const Mqueue & qu)
    { len=qu.len; anz=qu.anz;
    feld=new int[len];
    for (int i=0; i<anz; i++) feld[i]=qu.feld[i];
    }

    Mqueue Mqueue::verein(const Mqueue & p)
    { Mqueue tmp(*this);
    for(int i=0; i<p.anz; i++) tmp.enqueue(p.feld[i]) ;
    return tmp;
    }

    int Mqueue::anzahl ( void ){return 0;}
    bool Mqueue::leer ( void ){if( anz==0)return 1; return 0;}
    bool Mqueue::voll ( void ){if( anz!=0)return 1; return 0;}

    Mqueue::~Mqueue( )
    {
    }

    //------------------------------------------------------------------------------

    http://www.c-plusplus.net/forum/viewtopic-var-p-is-958373.html#958373


Anmelden zum Antworten