STACK in C



  • Hallo,

    ich will 2 Stacks in C-Sprache initializieren, aber leider weiss ich nicht wie.
    Kann mir jemand helfen ? Hier ist die Kode von meinen Dateien:

    STACK.h

    void STACKinit(void);
      int STACKisempty(void);
      void STACKpush(int item);
      int STACKpop(void);
      int STACKtopAndPop(void);
      int STACKtop(void);
    

    stack.c

    #include "STACK.h"
    #define MAX_SIZE 1000
    static int s[MAX_SIZE];
    static int N;
    void STACKinit(void) {
    N = 0;
    }
    int STACKisempty(void) {
    return N == 0;
    }
    void STACKpush(int item) {
    s[N++] = item;
    }
    int STACKpop(void) {
    return s[--N];
    }
    
    int STACKtopAndPop(void) {
    return s[--N];
    }
    
    int STACKtop(void){
    return s[N-1];
    }
    

    Vielen Dank
    Mincho



  • also wenn ich das nicht falsch verstanden habe dann mach doch einfach 2 zeiger und übergib einen als parameter

    bzw. speicher den stack auf dem heap



  • Kannst du mir es als Kode schreiben ?



  • ah sry, war grad in meinem code vertieft, sehe dass du nur int - variablen hast. also vergiss das was ich gesagt habe 😉

    hast du schon eine funktion geschrieben, oder hängst du noch an den prototypen ?



  • Also ich muss eine Funktion schreiben

    und hab die Funktion in Internet aber in Java oder in C++ gefunden
    und da brauche ich 2 Stacks und geht nicht.
    Und bei der Funktionen, die ich mit einem Stack probiert habe, geht irgendwie nicht 😞



  • wenn du 2 stacks mit int[] brauchst würd ich die erstmal deklarieren und in eine 2 datei deine funktionen auflisten,

    um inviduell in einen array einzutippen musst du halt einen parameter übergeben welchen array du halt meinst

    void STACKpush(int item, int A[]){
    }
    

    z.b



  • irgednwie verstehe ich nicht was du eigentlich meinst

    kannst du bishen klarer sein, vllt am besten mit definition von 2 Stacks und auch Aufruf von STACKpop() z.b.



  • static int zweiterStack[MAX_SIZE];
    
    int STACKpop(int A[]) { //der parameter dient dazu um einen der 2 stacks auszusuchen
    return A[--N];
    }
    

    btw. verstehst du was von paramtern usw. ?
    wenn nicht dann lies am besten ein kapitel über funktionen, weil sonst kann ich dir gleich den ganzen quelltext schreiben

    ah und warum machst du es static ?



  • Also ich verstehe etwas von Parametern, aber irgendwie verstehe ich nicht wieso definierst du nochmal die pop-Methode.

    Also ich hab die Datei stack.c

    dort sind alle Methoden fur den Stack definiert und sogar so:

    #include "STACK.h"
    #define MAX_SIZE 1000
    static int s[MAX_SIZE];
    static int N;
    void STACKinit(void) {
    N = 0;
    }
    int STACKisempty(void) {
    return N == 0;
    }
    void STACKpush(int item) {
    s[N++] = item;
    }
    int STACKpop(void) {
    return s[--N];
    }
    
    int STACKtopAndPop(void) {
    return s[--N];
    }
    
    int STACKtop(void){
    return s[N-1];
    }
    

    und in der Datei

    postfix.c

    will ich 2 Stacks initialisieren und mit denen arbeiten.

    Ich weiss nicht wie das in C-Kode geht.

    Z.b in C++ Kode sieht so aus:
    Initialisieren:
    stack<char> stkPostfix;
    stack<char> stkOperator;
    Benutzung:
    stkOperator.pop();
    stkPostfix.pop();

    Und genau diese 4 Zeilen will ich in C-Kode haben.



  • irgendwie komm ich nicht so ganz mit dir auf einen nenner,
    habs probiert aber irgendwie versteh ich nicht deine problematik, vielleicht kann dir jemand anders helfen



  • Mincho schrieb:

    will ich 2 Stacks initialisieren und mit denen arbeiten.

    probier's damit:

    typedef struct __bytestack
    {
       unsigned char *p;
       int top;
       int idx;
    } bytestack_t;
    
    bytestack_t *stack_create (unsigned int size)
    {
       bytestack_t *bs = malloc (sizeof (bytestack_t));
       if (!bs)
          return 0;
       bs->p = malloc (size);
       if (!bs->p)
       {
          free (bs);
          return 0;
       }
       bs->idx = 0;
       bs->top = size;
       return bs;
    }
    
    void stack_destroy (bytestack_t *bs)
    {
       free (bs->p);
       free (bs);
    }
    
    int stack_push (bytestack_t *bs, unsigned char b)
    {
       if (bs->idx == bs->top)
          return -1;
       bs->p[bs->idx] = b;
       bs->idx++;
       return 0;
    }
    
    int stack_pop (bytestack_t *bs)
    {
       bs->idx--;
       if (bs->idx == -1)
       {
          bs->idx = 0;
          return -1;
       }
       return bs->p[bs->idx];   
    }
    

    benutzen kannste es dann z.b. so:

    // test
    void main (void)
    {
       // stack für 3 bytes anlegen
       bytestack_t *stack = stack_create (3);
    
       // test: zugriff auf leeren stack
       printf ("pop vom leeren stack: %d\n", stack_pop(stack));   // geht schief, stack leer
       puts("");
    
       // ein paar daten drauf tun
       printf ("1 drauf: %d\n", stack_push (stack, 1));
       printf ("2 drauf: %d\n", stack_push (stack, 2));
       printf ("3 drauf: %d\n", stack_push (stack, 3));
       printf ("4 drauf: %d\n", stack_push (stack, 4));  // geht schief, stack zu klein
       puts("");
    
       // ausgabe
       printf ("3 runter: %d\n", stack_pop(stack));
       printf ("2 runter: %d\n", stack_pop(stack));
       printf ("1 runter: %d\n", stack_pop(stack));
       printf ("stack leer: %d\n", stack_pop(stack));   // geht schief, stack leer
       printf ("stack leer: %d\n", stack_pop(stack));   // geht schief, stack leer
       puts("");
    
       // stack löschen
       stack_destroy (stack);
    }
    

    🙂


Anmelden zum Antworten