c Stack mit list, pop, push & exit

nasir

New member
Schreiben Sie ein Programm, mit dem Zeichen auf einen Stack der maximalen Länge 5 geschrieben bzw. gelöscht werden
können! Das Ende des Stacks soll mit einem Nullbyte markiert werden. Das Programm soll auf folgende Kommandos
reagieren:
? list: Der Stackinhalt soll als String ausgegeben werden.
? pop: Das letzte Zeichen soll ausgegeben und gelöscht werden.
? push <Zeichen>: Ein Zeichen soll angefügt werden.
? exit: Das Programm soll verlassen werden.
Bei anderen Eingaben soll eine Fehlermeldung ausgegeben werden.

Code:
#include <stdio.h>
#include <stdlib.h>
#define MAXSTACK 5
#define LEERESSTACK -1

int top = LEERESSTACK;
char zeichen[MAXSTACK];

void push(char c) {
   zeichen[++top] = c;
}

char pop() {
   return zeichen[top--];
}

int voll()  {
   return top+1 == MAXSTACK;
}

int leer()  {
   return top == LEERESSTACK;
}

void push( char );
char pop();
int leer();
int voll();

    
int main(void)
{
/*    char zeichen[5];*/

   char ch;
   printf("Geben sie maximal 5 zeichen ein:\n");
   while ((ch = getchar()) != '\n')
   {
      if (!voll()) push(ch);
      }
   //wird rückwärts ausgegeben bis Stack leer ist
   printf("Ausgabe Lautet:\n");
   while (!leer())
   {
      printf("%c", pop());
      }
   return 0;

}

Ich habs versucht Aufgabentreu zu machen, aber schaff das nicht. Weiß einer wie ich List, Exit und das mit dem Nullbyte machen kann?
Wäre sehr dankbar dafür. =)
 
S

sw33tlull4by

Guest
Hoert sich fuer mich sehr nach Hausaufgabe an.
Von daher keine Loesung von mir , ABER:

die if-abfrage mit voll()
ist nicht richtig.
voll gibt immer den Wert 5+1 zurrueck und das ist ungleich 0 und unter C somit immer wahr.
Du brauchst auch keine Abfrage fuer voll,
Leer-Abfrage reicht vollkommen.
(mal unter uns: wenn du den Code auf die Aufgabe zuschneidest und es nicht fuer beliebig viele Elemente implementierst hast du mehr schreibarbeit ;) )
Darueber hinaus gibt es meines wissens nach keine Implementation von LinkedLists unter C.
Das ist erst ab C++ drin.
d.h. es fehlt dir auch eine Strucktur um die Elemente zu speichern.
Ich an deiner Stelle wuerde mit folgendem Konstruckt,unter der zuhilfenahme von malloc und einer Schleife hantieren.

struct LinkedLIst {
char element;
struct LinkedList *neueListe;
}

.......
neueListe = malloc(sizeof(struct LinkedList));
.....
mfg

sw33t

P.S.:Makros brauchst du in diesem Fall ueberhaupt nicht.
 

nasir

New member
naja ich habs jetzt mal anders prgrammiert. Hausaufgabe ist es nicht, nur ne Übung im Informatik Studium. :p

Code:
#include <stdio.h>
#include <stdlib.h>
#define MAXSTACK 5
#define LEERESSTACK -1
#define MAXLEN 10

int top = LEERESSTACK;
char zeichen[MAXSTACK];

void push(char c) {
   zeichen[++top] = c;
}

char pop() {
   return zeichen[top--];
}

int voll()  {
   return top+1 == MAXSTACK;
}

int leer()  {
   return top == LEERESSTACK;
}

void list() {
     int i;
     for(i =0; i < MAXSTACK; i++)
           printf("%c", zeichen[i]);
     printf("\n");
     }

void push( char );
char pop();
int leer();
int voll();

    
int main(void)
{
      printf("Geben sie maximal 5 zeichen ein:\n");
      char sinput[MAXLEN + 1];
      char ch;
      do{         
          scanf("%10s", &sinput);
          if(strcmp(sinput, "list") == 0)
          {
            list();
          }
          if(strcmp(sinput, "pop") == 0)
          {
           printf("Buchstabe %c ist in der Liste geloescht worden\n", pop());
          }
          if(strlen(sinput)==6 && strncmp(sinput, "push ", 5))
          {
              if (!voll()) {push(sinput[5]);
              printf("Buchstabe %c ist in der Liste\n", sinput[5]);}
          }
 //Fehlerüberprüfung!!
          if(strcmp(sinput, "list") != 0 && strcmp(sinput, "pop") != 0 && strlen(sinput)!=6 && strncmp(sinput, "push ", 5) != 0){
               printf("Ueberpruefen sie ihre Eingabe!\n");
               }
      } while (strcmp(sinput, "exit"));
      printf("Programm wurde beendet");
      return 0;
}

den letzten if habe ich eingebaut, weil ich die Fehler besser anschauen wollte. Also die Eingabe von list, pop und exit sind nicht falsch. bei dem Push ist ein Fehler. Ich hab getestet und die EIngabe "list pop" gemacht und die Befehle wurden nacheinander ausgeführt. deswegen ist es problematisch mit "push X" weil er dann bei Push und bei X eine Fehlermeldung liefert. Was nun?
 

CDW

Moderator
Mitarbeiter
funktioniert doch alles - sofern man "push_x" eingibt ;)
denn:
http://homepages.cwi.nl/~aeb/linux/man2html/man3/scanf.3.html
s
Matches a sequence of non-white-space characters;
sowas läuft (ist allerdings nicht empfehlenswert gets zu nutzen - nur habe ich jetzt keine Lust stundenlang nach einer anständigen C-einelesefunktion zu suchen ;) )
Code:
 do{         
          gets(sinput);
          if(strcmp(sinput, "list") == 0)
          {
            list();
          }
          if(strcmp(sinput, "pop") == 0)
          {
           printf("Buchstabe %c ist in der Liste geloescht worden\n", pop());
          }
          if(strncmp(sinput, "push", 4))
          {
              if (!voll()) {push(sinput[5]);
              printf("Buchstabe %c ist in der Liste\n", sinput[5]);}
          }
 
Oben