Zwei Queues zu einem Stack



  • Sorry aber kapier das nicht was du meintest!



  • ahh verstanden glaub ich:
    mann füllt den ersten queue:
    →5-4-3-2-1→
    schiebt dann alle bis auf das letzte in Queue 2 und liest das letzte element aus:
    →4-3-2-1→
    schiebt dann wieder alle bis auf das letzte in Queue 1 und liest das letzte element aus:
    →3-2-1→
    usw.:
    Als ergebnis bekommt man nun:
    1
    2
    3
    4
    5
    Richtig der Ansatz?



  • Richtig der Ansatz?

    So war's gedacht. Aber die Idee ist fürchterlich. Warum nicht gleich einen Stack bauen?



  • Tja hab ICH mir nicht ausgesucht 😉





  • Erhard Henkes schrieb:

    http://www.velocityreviews.com/forums/t526084-implement-a-stack-using-two-queues.html

    🙂

    I have two things to say to this

    1. What the **** has this got to do with C?
    2. Why would anyone outside an academic ivory tower want to waste their
      time concocting something so ugly and sick?


  • Hi! KAnn mir jemand evtl mal mit dem Quellcode helfen? Ich probier jetzt schon die ganze zeit und weis nicht weiter! Ich würde es am liebsten mit zwei Funktionen (Put und Get) realisieren. Sodass ich dann im Hauptprogramm nur noch mit Put und Get arbeiten muss. Ist das irgendwie möglich? Ich würd mich echt freuen wenn mir einer von euch Profis da weiterhelfen könnte!



  • Was hast du denn bisher schon an Code?



  • So gut wie garnichts weil mir mein Compiler immer nur Fehlermeldungen ausspuckt!



  • Mir würde ja der Quellcode von einem Programm wo ein Queue erstellt wird schon reichen!



  • Soweit bin ich:
    Und es ist irgendwie ein Fehler drin!

    #include <stdio.h>
    #include <stdlib.h>
    
    //  Knoten für lineare Liste
    
     typedef struct node 
      {
         struct node *next;       // Zeiger auf den nächsten Knoten
         int key;                 // Knotennummer
    	 int zahl1;               // Gespeicherte Zahl
      }
    
    //  Hauptprogramm
    
     int main(void)
     {
        int i; 
        node *Queue1 = NULL;      // Initialisierung: "Queue1" ist der Anker des 1. Queues
    
        for (i = 1; i <= 6; i++)
         {
         printf("\nBitte geben sie die %i. Integerzahl ein:",zahlINT);
    
         // Neuen Knoten einfügen
         node *new_node = (node *) malloc ( sizeof( node )); // Speicher für neuen Knoten reservieren
         new_node->next = NULL;                              // Zeiger initialisieren
         new_node->key = i;                                  // Knoten Zählen
         scanf("%i", &zahl1);                                 // Zahl Einlesen
        };
    
        system("Pause");
        return 0;  
     }
    


  • Und es ist irgendwie ein Fehler drin!

    Wird wohl daran liegen, dass in Zeile 29 zahl1 nicht bekannt ist. Aber warum sagst du uns das nicht gleich? Ich bin doch kein Compiler.



  • Gibt es ne Möglichkeit zwei Funktionen (Put und Get) zu erstellen und dann im Hauptprogramm nur noch mit Put und Get zu arbeiten? Wäre doch am elegantesten! WIe könnte man das realisieren?



  • Mike1087 schrieb:

    Gibt es ne Möglichkeit zwei Funktionen (Put und Get) zu erstellen und dann im Hauptprogramm nur noch mit Put und Get zu arbeiten? Wäre doch am elegantesten! WIe könnte man das realisieren?

    Mach dir eine eigene *.c-Datei, die die Listenverwaltung für die Queue erledigt, und mach dort alles bis auf die beiden Funktionen static . Dann kann keiner mehr drauf zugreifen ohne die Datei zu verändern.
    🙂

    node *new_node = (node *) malloc ( sizeof( node ));
    // free() kommt nie
    

    Ist dir schon der Speicher ausgegangen?



  • Das Programm hat ja noch nicht funktioniert!
    Aber du scheinst echt Ahnung zu haben!
    Ich stell mir das so vor, dass ich im Hauptprogramm für das füllen der Queue nur noch so ein Code hab:

    for (i = 1; i <= 6; i++)
      { 
      Queue1 = Put(Queue1, i );
      };
    


  • Folgende Vorschläge:

    1.) Statt

    Queue1 = Put(Queue1, i );
    

    Wäre mir lieber:

    Put(Queue1, i);
    

    Den ganzen Zauber soll die Put-Funktion erledigen und vor dem Anwender verstecken. Ist aber letztlich Geschmacksache.

    2.) Mach dir folgende Funktionen:

    - NewQueue()
    um eine neue leere Queue zu erzeugen (falls du dich später entscheiden solltest, dass eine leere Queue anders repräsentiert wird als durch NULL). Rcükgabetyp sollte ein Zeiger auf Queue sein.

    - Put()
    zum Reinschieben in die Queue, aber (siehe oben) vielleicht so, dass man keine Zuweisung mehr machen muss. Typ sollte void sein (oder besser int, damit man an der Rückgabe erkennen kann, ob ein Fehler passiert ist). Da wird ein malloc() drin stecken.

    - Push()
    zum Rausholen. Typ ist in deinem Fall int weil du eine Queue von int's anlegen willst. Da wird ein free() drin stecken.

    - DestroyQueue()
    zum Freigeben einer Queue die keiner mehr braucht. Da wird für jedes Element in der Queue ein free() drin stecken (oder noch mehr, falls du die Repräsentation änderst).

    Aber du scheinst echt Ahnung zu haben!

    Schleimen wird schon helfen? Aber im Ernst: ich bin schon lange genug hier unterwegs, da schnappt man manches auf. Die, die's mir beigebracht haben, sind aber teilweise auch noch hier unterwegs.
    🙂



  • ich schrieb:

    - Push()
    zum Rausholen ...

    Ich meinte natürlich Get() und nicht Push().



  • Das sollte jetzt nicht direkt schleimen sein!
    Ich versuch mal mein Glück!
    Also die Put Funktion müsste in etwa so aus sehen oder?

    int Put(int)
    {
    int i=1
    node *new_node = (node *) malloc ( sizeof( node )); // Speicher für neuen Knoten reservieren
    new_node->next = NULL;                              // Zeiger initialisieren
    new_node->key = i;                                  // Knoten Zählen
    new_node->zahl = i;                                 // Zahl Speichern
    i++
    }
    


  • Mike1087 schrieb:

    Das sollte jetzt nicht direkt schleimen sein!

    Bitte mich nicht zu ernst nehmen. 😉

    Ich versuch mal mein Glück!
    Also die Put Funktion müsste in etwa so aus sehen oder?
    ...

    In etwa, ja. Der key-Member ist ziemlich sicher unnötig.

    Auch hast du vergessen, den next-Zeiger des letzten Elements auf das neue zu setzen. Da macht es dann Probleme, wenn die leere Queue NULL ist, weil da drin kein Zeiger ist, den man setzen könnte. Deshalb könnte man die Repräsentation ändern. ZB indem man eine neue Struktur queue einführt, in der ein Zeiger auf node ist (den Anfang der Queue -- oder das Ende?), und eine zweite Struktur node (wie bisher), die einen Knoten der Liste bedeutet. Aber das geht sicher auch anders.

    Ich geh jetzt schlafen, vielleicht träum ich ja davon, wie man am besten eine Queue baut. Aber googlen bringt sicher grössere Erfolgschancen.
    🙂



  • Okay! wär echt cool wenn dir da mehr zu einfallen würde! Ich komm nämlich garnicht klar mit dem Zeug!


Anmelden zum Antworten