Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

"Aus klein mach groß": Teil1 - Stack

Diskussion: "Aus klein mach groß": Teil1 - Stack im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Anzeige Ich habe mir gedacht, eine Reihe mit kleinen Aufgaben herauszubringen, die sich auch/gerade von Anfängern gut bewältigen lassen ( ...

Antwort
Alt 04.05.07, 16:45   #1 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard "Aus klein mach groß": Teil1 - Stack

Anzeige

Ich habe mir gedacht, eine Reihe mit kleinen Aufgaben herauszubringen, die sich auch/gerade von Anfängern gut bewältigen lassen (und sich speziell an diese richten ) und auch eine schöne Übung für die "frischerlernte" Programmiersprache darstellen sollten.

Die Aufgaben bauen aufeinander auf und werden am Ende zusammengesetzt, so dass scheinbar aus "Nichtigkeiten" ein doch recht solides Programm entsteht, worauf man dann als Programmieranfänger durchaus stolz sein kann .
Das bringt 1) ein bisschen Motivation und 2) verdeutlicht nochtmal das Prinzip von "divide and conquer".
http://de.wikipedia.org/wiki/Teile_und_herrsche

Teilaufgabe1: setze einen Stack um.

Stack ist eine Struktur, die Informationen speichern und ausgeben kann - und zwar nach dem Prinzip "Zuerst rein, zuletzt raus". Bildlich kann man es sich mit einem Stapel Karten vorstellen: man nimmt eine Karte, legt sie auf den Tisch, legt die nächste darauf usw. Um jetzt an eine bestimmte Karte zu kommen, muss man alle vorherigen vom Stapel wegnehmen.
http://de.wikipedia.org/wiki/Stapelspeicher
Es klingt komplizierter als es ist

Vorgabe:
für Freunde der prozeduralen Programmierung (C,Pascal oder wer prozedural mit Java/C++/C# programmiert):

setze folgende Funktionen um (Parameternamen sowie Übergabe nur als Vorschlag):

push(ein_stack,elem) - legt ein übergebenes Element "elem" auf dem Stack "ein_stack" ab.
pop (ein_stack) - gibt das zuletzt auf dem Stack "ein_stack" abgelegte Element zurück. Dabei wird dieses Element vom Stack entfernt
top(ein_stack) - gibt das zuletzt auf dem Stack "ein_stack" abgelegte Element zurück, ohne dieses Element zu entfernen.
isEmpty - gibt zurück, ob der Stack leer ist (z.B als Boolean Wert)

Es sollte also möglich sein, ein Element in einen bestimmten Stack einzufügen und wieder abzufragen/entfernen.
Die Objectorientierten unter euch sollten dann eine Klasse Stack umsetzen, die dieselben Methoden bietet (also Element einfügen, wegnehmen usw.)

Es sollte aufjedenfall möglich sein, mehrere Stacks gleichzeitig im Programm zu benutzen.

Versucht dabei möglichst allgemein zu bleiben, so dass der "Stackinhalt" Datentypunabhängig ist bzw. schnell an einen neuen Typ angepasst werden kann.
Wenn es noch zu schwer ist: Im Stack sollten Ziffern abgelegt werden können.

tipp zu einer einfachen Umsetzung   

Eine einfache Möglichkeit wäre es, einen Array zu betrachten:
Code:
 Anfang          Ende
   |               |
   v               v
  +--+--+--+--+--+---+
  |L |E |E |R |  |   |
  +--+--+--+--+--+---+
Wir können in einem Array Daten ablegen. Wenn wir einen Zähler
haben, können wir z.B mitzählen wie oft etwas eingefügt bzw. wieder entnommen 
wurde und gleichzeitig würde dieser auch auf die Position im Array zeigen, in dem 
das aktuell oberste Element zu finden ist. Also bei jedem Push den Zahler um 1 
erhöhen und bei jedem Pop um 1 erniedrigen. Beim "Top" machen wir nichts mit dem 
Zähler und beim "isEmpty" müssen wir nachschauen, ob der Zähler >0 ist (oder einer 
bestimmten Zahl ;) )

Bsp:
Programmstart:
setzte zaehler=-1;

push(6) -> zaehler=zaehler+1 (also Zaehler=0);
array[zaehler]=6;

  +--+--+--+--+--+---+
  |6 |  |  |  |  |   |
  +--+--+--+--+--+---+
   ^
   | Zähler


Push(8) -> Zaehler=Zaehler+1 (also = 1);
array[zaehler]=8
Push(9)-> Zaehler=Zaehler+1 (also = 2)
array[zaehler]=9
  +--+--+--+--+--+---+
  |6 |8 |9 |  |  |   |
  +--+--+--+--+--+---+
         ^

pop(); ->Zaehler=Zaehler-1 (also wieder 1);
  +--+--+--+--+--+---+
  |6 |8 |9 |  |  |   |
  +--+--+--+--+--+---+
      ^
top() -> rückgabe=array[zaehler] (also array[1]=rückgabe =  8)


Allerdings - hier müsstet ihr noch unbedingt eine Übrprüfung  einbauen, um micht mehr 
Elemente einfügen zu können, als Plätze im Array vorhanden sind.
z.B per isFull() abfragen können oder in der Push() Funktion eine Überprüfung 
durchführen (if (Zaehler<Array_size) zaehler=zaehler+1;


Als Test sollte euere Anwendung eine kleine Zahlenreihe einlesen und dann rückwärts ausgeben können.
Bsp:
1,2,3,4,5 Einlesen
5,4,3,2,1 Ausgeben
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
Alt 05.05.07, 13:33   #2 (permalink)
 
Registriert seit: 20.11.05
CraHack Leistung: Facit NTK
Likes: 0
Standard

Hi


Bin mal gespannt was da am Ende heraus kommt.


Blitz3d mit Types :)   


push(1,1)
push(1,2)
push(1,3)
push(1,4)
push(1,5)
Print pop(1)
Print pop(1)
Print pop(1)
Print pop(1)
Print pop(1)


Type DerStack
Field Stack_Nummer
Field Dateninhalt$
End Type




Function Push(Ein_Stack,Elem$)
DerStack.DerStack=New DerStack
DerStack\Stack_Nummer=Ein_Stack
DerStack\Dateninhalt$=Elem$
Insert DerStack Before First DerStack
End Function

Function Pop$(Ein_Stack)
For DerStack.DerStack=Each DerStack
If DerStack\Stack_Nummer=Ein_Stack Then
Puffer$=DerStack\Dateninhalt$
Delete DerStack
Return Puffer$
EndIf
Next
End Function

Function Top$(Ein_Stack)
For DerStack.DerStack=Each DerStack
If DerStack\Stack_Nummer=Ein_Stack Then
Return DerStack\Dateninhalt$
EndIf
Next
End Function

Function isEmpty(Ein_Stack)
For DerStack.DerStack=Each DerStack
If DerStack\Stack_Nummer=Ein_Stack Then
Return False
EndIf
Next
Return True
End Function


Und jetzt noch mit VB express 08   

Public Class AStack
Private StackData(255) As String
Private Position As Byte

Public Function push(ByVal elem As String) As Boolean
Position = Position + 1
StackData(Position) = elem
Return True
End Function

Public Function pop() As String
Dim Buffer As String
Buffer = StackData(Position)
If Position > 0 Then
Position = Position - 1
End If
Return Buffer
End Function

Public Function top() As String
Return StackData(Position)
End Function

Public Function isEmpty() As Boolean
If Position = 0 Then Return True
Return False
End Function

End Class
CraHack ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 08.05.07, 17:07   #3 (permalink)
 
Benutzerbild von Eydeet
 
Registriert seit: 14.04.06
Eydeet Leistung: Facit NTK
Likes: 4
Standard

Ich hab mal einfach alles in eine Datei gepackt, wegen leichterem Copy 'n Paste
Zur Speicherung von verschiedenen Datentypen habe ich C++-Templates benutzt.
stack.cpp   
Code:
#include <iostream>

using namespace std;

template <typename T>
class Stack
{
    public:
        Stack();
        Stack(int size);
        ~Stack();

        void push(T element);
        T    top();
        T    pop();
        bool isFull() const;
        bool isEmpty() const;

    private:
        T   *stack;
        int  stackSize;
        int  elementOnTop;
};

template <typename T>
Stack<T>::Stack()
{
    Stack(10);
}

template <typename T>
Stack<T>::Stack(int size)
{
    stackSize = size;
    elementOnTop = -1;

    stack = new T[stackSize];
    if (stack == 0)
    {
        throw "Stack could not be created";
    }
}

template <typename T>
Stack<T>::~Stack()
{
    delete[] stack;
}

template <typename T>
void Stack<T>::push(T element)
{
    if (isFull())
    {
        throw "Stack is full";
    }

    elementOnTop++;
    stack[elementOnTop] = element;
}

template <typename T>
T Stack<T>::top()
{
    if (elementOnTop != -1)
    {
        return stack[elementOnTop];
    }
    else
    {
        throw "No element on stack";
    }
}

template <typename T>
T Stack<T>::pop()
{
    if (elementOnTop != -1)
    {
        elementOnTop--;
        return stack[elementOnTop+1];
    }
    else
    {
        throw "No element on stack";
    }
}

template <typename T>
bool Stack<T>::isFull() const
{
    if (elementOnTop + 1 == stackSize)
    {
        return true;
    }
    else
    {
        return false;
    }
}

template <typename T>
bool Stack<T>::isEmpty() const
{
    if (elementOnTop == -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    try
    {
        Stack<int> stack(10);

        // stack füllen
        for (int i = 0; !stack.isFull(); i++)
        {
            stack.push(i);
        }

        // stack leeren
        while (!stack.isEmpty())
        {
            cout << stack.pop() << endl;
        }
    }
    catch (const char *error)
    {
        cerr << "Error: " << error << endl;
        return 1;
    }
}
Eydeet ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » "Aus klein mach groß": Teil1 - Stack
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
"Aus klein mach groß": Teil3 - Rechnen mit Zahlen CDW Programmieraufgaben 5 22.03.08 13:25
"Aus klein mach groß": Teil2 - Zahlen und Satzzeichen CDW Programmieraufgaben 8 24.02.08 01:58
Stack Overflow harissa Hacks & Crackmes 0 12.11.07 18:35
"Aus klein mach groß": Teil4- Zahlen anordnen CDW Programmieraufgaben 2 03.06.07 21:56
Stack - Programmierung Outbraker Code Kitchen 3 17.11.06 13:52


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61