Perl______ __C________ __JavaScript _VisualBasic __Java_____kernel bauen

Coming soon. Dasselbe Programm gibt es auch in VisualBasic. Demnächst hier.

Elementare Datenstrukturen

Datenstrukturen und Algorithmen sind sehr eng miteinander verbunden. Einige Datenstrukturen treten so haeufig in Algorithmen auf, dass man sie als elementar bezeichnen kann. Felder, Stapel und Schlangen oder verkettete Listen sind von wesentlicher Bedeutung fuer die Programmierung. Im Folgenden werden Sie deshalb diese Datenstrukturen naeher kennenlernen.

Felder

Eine sehr wichtige Datenstruktur, die in den meisten Programmiersprachen schon als grundlegender Datentyp zur Verfuegung steht sind Felder. Ein Feld ist eine Folge von gleichen Datentypen, die zusammenhaengend gespeichert werden. Die einzelnen Elemente dieses Feldes werden ueber Indizes angesprochen. Das Feld wird haeufig auch als Vektor oder Array bezeichnet. Wir kennen diese Datenstruktur aus dem Kapitel Arrays.

Das Arbeiten mit Feldern soll das folgende Beispiel verdeutlichen. Es wird ein Feld zur Aufnahme von 10 Strings angelegt. Anschliessend werden Zeichenketten in dieses Feld eingelesen. Nachdem das Array gefuellt ist, werden die einzelnen Strings wieder ausgelesen und ausgegeben.

#include 

#define ZEILENZAHL 10
#define ZEILENLAENGE 80

int main()
{
  char text[10][80];
  char (*zeile)[80];
  int i;

  zeile=text;

  printf("Bitte geben Sie nun %d Zeilen Text ein:\n",ZEILENZAHL);
  fflush(stdin);
  for(i=0;i<10;i++){
    printf("%d >> ",i);
    gets(text[i]);
  }
  printf("Ihr Text war der folgende:\n");
  while(zeile < ( char (*)[80] ) text[ZEILENZAHL])
    printf("%s\n",zeile++);

  printf("Und einmal zurueck\n");
  while(zeile > text)
    printf("%s\n",--zeile);
  return(0);
}
#include 

int main()
{
  char s1[80],s2[80],s3[80];
  char *array[3];
  int i;

  array[0] = s1;
  array[1] = s2;
  array[2] = s3;

  for(i=0;i<3;i++){
    printf("Ein Satz: ");
    gets(array[i]);
  }
  printf("Wenn Sie eine 0 eingeben, endet das Programm! \n");
  while((i = getchar() - '0')!=0){
    printf("Satz %d : %s\n",i,array[i]);
    fflush(stdin);

   }
  return(0);
}

Stapel

Die Stapel sind eine besondere Form, Daten zu sortieren. Man stelle sich einen Stapel Blaetter vor, die auf dem Schreibtisch liegen. Um an das unterste Blatt heranzukommen, muss ich schon alle anderen Blaetter vorher wegnehmen.-
Der Stapel in der Informationstechnik findet sich z.Bsp. im Hauptspeicher des Rechners. Z.Bsp. Ruecksprungadressen von Funktionen werden hier abgelegt und auch der Reihe nach wieder heruntergenommen. Last in, First out. lifo-Prinzip. Im hier zu besprechenden Beispiel wollen wir einen mathematischen Ausdruck berechnen. In normaler Schreibweise (Infix-Notation) wuerde man sagen:
5*4+3 (5*(4+3))
in der Praefix-Notation, sieht das folgendermassen aus:
+*543 (*5+43) und in der Postfix-Schreibweise:
543+* (54+3*)
Die Berechnung eines Postfix-Ausdrucks kann leicht mit einem Programm realisiert werden, das sich eines Stapel-Alogerithmuses bedient.

_________________________________________________________________
| n = 1	                                                        |
_________________________________________________________________
| Solange n <= Laenge des Strings Postfix                       |
| _______________________________________________________________
| |                      Postfix ist                            |
| |-------------------------------------------------------------|
| | eine	       | ein                   |                |
| | Ziffer	       | Operator              | sonstiges      |
| |______________________________________________________________
| | Zifferfolge lesen  | Operanden A und B     |      /         |
| | und Zahl           | vom Stapel holen      |      /         |
| | zusammenfuegen     |                       |      /         |
| |______________________________________________________________
| | Zahl auf den       | Operator auf A        |      /         |  
| | Stapel legen       | und B anwenden        |      /         |
| |                    |_______________________|                |
| |                    | Ergebnis auf den      |                |
| |		       | Stapel legen          |                |
|________________________________________________________________
|  Ergebnis vom Stapel nehmen                                   |
_________________________________________________________________

_________________________________________________________________
 Stapel         Postfix-Term        Operation
_________________________________________________________________
                45*67*+             4 auf den Stapel legen
  4		5*67*+              5 auf den Stapel legen
  5,4		*67*+		    Die beiden obersten Werte vom
				    Stapel nehmen und per *
				    verknuepfen (4*5) und das Ergebnis
				    20 auf den Stapel legen.
  20		67*+		    6 auf den Stapel legen
  6,20		7*+		    7 auf den Stapel legen
  7,6,20	*+		    Die beiden obersten Werte vom
                                    Stapel nehmen und per * (7*6)
				    verknuepfen und das Ergebnis 42
				    auf den Stapel legen.
  42,20		+		    Die beiden obersten Werte vom
				    Stapel nehmen und per +
				    verknuepfen und das Ergebnis auf
				    den Stapel legen.
  62				    Ergebnis vom Stapel nehmen.
__________________________________________________________________
#include 
#include 


char postfix[20],c; // Eine Zeichenkette
  int n,m,x,tos,stack[20]; //Auf den Stapel werden nur Zahlen gelegt
 
// Umwandeln eines Zeichens in eine int-Zahl (Zeichen - '0') liefert das 
int atoi(char c)
{
  int i;
  i= c - '0';
  return i;
}

  void init_stack()
     {
      tos=0;
    }

  void push(x)

    if(tos == 200)
      {
	printf("Stapelueberlauf\n");
      }
    else
      {
	//an der Stelle(tos) wird der neue Wert in den Stapel gelegt.
	stack[tos]=x;
	//danach wird der Wert von tos um 1 erhoeht, so das ich
	//einen neuen Wert auf den Stapel ablegen kann.
	tos = tos +1;
      }
  }

  int pop()

      if(tos == 0)
	{
	  printf("Stapelunterlauf\n");
	}
      else
	{
	  //tos zeigt auf eine freie Stelle im Stapel
	  tos = tos -1;
	  //an dieser Stelle soll der Stapel einen neuen Wert aufnehmen
	}
        return(stack[tos]); 
	}

Auswahl: Wenn eine Zahl vorliegt, dann Zahl auf den Stapel legen. Falls ein Operand gefunden wird, die letzten beiden Operanden vom Stapel nehmen und mit dem Operator verknuepfen und das Ergebnis auf den Stapel legen.-
Hauptroutine


int main()
{
  printf("Ein Ausdruck: ");
  scanf("%s",postfix);
  init_stack();

  m=strlen(postfix);
  n=0;
  while(n kleiner m)
	{
	   switch(postfix[n])
		{
		case '0': case '1': case '2': case '3': case '4':
		case '5': case '6': case '7': case '8': case '9':
		      c=postfix[n];
		      x=atoi(c);
		      break;
		case '+':
		  x=pop()+pop();
		  break;
		case '-':
		  x=pop();
		  x=pop()-x;
		  break;
		case '*':
		  x=pop()*pop();
		  break;
		case '/':
		  x=pop();
		  x=pop()/x;
		  break;
		  	}  //end switch
	      push(x);
	        n++;
	} //end while n kleiner m
      x=pop(); // Ergebnis vom Stapel nehmen.
      printf("Das Ergebnis: %d\n",x);
    return(0);
}  

Die Stapelroutinen sind als Funktionen realisiert. Dies sind init_stack fuer die Initialisierung des Stapels, push fuer das Ablegen eines Wertes und pop fuer das Herunternehmen vom Stapel.
Ausserdem musste ich eine Routine schreiben fuer das Umwandel eines Strings in Zahlen. Die Funktion atoi(x). Am einfachsten kann char - '0' dies leisten.-
Ausserdem sollte fuer die Rechenoperation beachtet werden, das der zweite Operand vor dem ersten im Stapel liegt und daher voruebergehend in x gespeichert werden muss.
Der Stapel selbst wird als Array stack[] initialisiert, das maximal 200 Elemente aufnehmen kann. Die Variable tos enthaelt immer den Index der Zelle im Stack, die als naechstes gefuellt werden kann.
init_stack setzt die Variable tos auf null.
Bei den Routinen pop und push ist zu beachten, das der Stapel ueber oder unterlaufen kann. Daher die Sicherheitsabfrage mit if().
Die Auswahlentscheidung treffen wir mit switch.