Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Stack Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
21.10.2007, 21:41 Uhr
power



weil wir sonst C hatten und jetzt mit C++ anfangen! Ich denke, wir werden den stack dann nach und nach in eine klasse packen. mal sehen, was sich der prof da ausdenkt

nun zum stack wieder: aber der stack ist ja gar nicht leer! es wird doch etwas hineingepuscht!

aber die main funktion wurde so vom prof vorgegeben, so dass ich daran nix geändert habe

Dieser Post wurde am 21.10.2007 um 21:42 Uhr von power editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
21.10.2007, 23:57 Uhr
0xdeadbeef
Gott
(Operator)


Ja, aber zu dem Zeitpunkt hast du bereits so viel vom Stack runtergepoppt, dass er wieder leer ist.

Aber mal ganz ehrlich - wenn dein Prof so eine Funktion in einem C++-Programm vorgibt, dann hat er von der Sprache nicht besonders viel Ahnung.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
22.10.2007, 08:34 Uhr
power



das mit dem prof hat schon ein anderer gesagt

Ich habe die while schleife so verstanden, dass er immer einen Buchstaben poppt, den ausgibt und dann wieder in die pop funktion geht.

naja, ist auch egal!

ich frage ihn einfach noch einmal.
vielen dank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
22.10.2007, 09:13 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


achja ansonsten überprüfst du nicht beim pop ob überhaupt noch was drin ist - nur beim push prüfst du (inzwischen)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
23.10.2007, 16:57 Uhr
ao

(Operator)



Zitat von FloSoft:
achja ansonsten überprüfst du nicht beim pop ob überhaupt noch was drin ist

Ist ja auch bei der vorgegebenen Signatur (char Pop (...)) ein ziemliches Dilemma. Was soll die arme Funktion zurückgeben, wenn nix da ist?

Entweder muss man die Signatur ändern und ein TryPop machen, das sagen kann "ich konnte nicht", oder man muss bereit sein, eine Exception zu fangen, die von Pop geworfen wird, oder man legt einfach fest, dass dieser Stack nur gutmütig benutzt werden darf und dass man gefälligst vor dem Poppen isEmpty zu fragen hat.

Egal, was man macht, Hauptsache, alle halten sich dran. Aber ein nacktes Pop ist doof.

Gruß,
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
05.11.2007, 20:13 Uhr
power



So, ich bins noch einmal.

Jetzt sollen wir den Stack mit einer Klasse realisieren, die Konstruktoren und Destruktoren enthält.


Meine Dateien wieder:

stack.h

C++:
#ifndef KLASSE_STACK
#define KLASSE_STACK


class Stack{

private:
    unsigned int depth; // Tiefe des Stacks
    char *content;        // Inhalt des Stacks
    unsigned int top;    // Index des obersten Elements

public:
    void push(Stack *, char);
    char pop(Stack *);
    int isEmpty(Stack *);
    
};


#endif


stack.cpp

C++:
#include "stack.h"
#include <iostream>
using namespace std;


void Stack::push(Stack *p, char x)
{
    if(p->top>p->depth)
        cout << "Kein Platz mehr auf dem Stack" << endl;
    else
    {
        p->content[p->top]=x;
        p->top++;
    }
}

char Stack::pop(Stack *p)
{
    if(p->top==0){
        cout << "Stack bereits leer!" << endl;
    }
    else{
        p->top--;
        return p->content[p->top];
    }
}

int Stack::isEmpty(Stack *p)
{
    if(p->top!=0)
        return 0;
    else
        return 1;
}




main.cpp

C++:
#include <iostream>
#include "stack.h"
using namespace std;


int main()
{
// Test der Datenstruktur STACK
    Stack *s;
    //s=createStack(3); <---- wie erzeuge ich nun 3 dinger davon?!?!?!?!?!?!?!
    s->push(s,'a');
    s->push(s,'b');
    s->push(s,'c');
    s->push(s,'d');
    while (! s->isEmpty(s)) // !0 wird zu 1 ODER !1 wird zu 0
        cout << s->pop(s) << endl;
    s->pop(s);
    //destroyStack(s);
    cin.ignore();
    return 0;
}




Wie kann ich nun 3 Dinge erstellen??? Vorher hatte ich ja nen struct, aber nun weiß ich nicht wie das mit den Klassen geht.

gruß power
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
05.11.2007, 20:24 Uhr
0xdeadbeef
Gott
(Operator)



C++:
    void push(Stack *, char);
    char pop(Stack *);
    int isEmpty(Stack *);


...nimm da mal ganz schnell die Stack*s aus der Signatur, du hast doch this dafür:

C++:
    void push(char);
    char pop();
    bool isEmpty() const;


Und dann dementsprechend

C++:
void Stack::push(char x)
{
    if(top >= depth)
        cout << "Kein Platz mehr auf dem Stack" << endl;
    else
    {
        content[top]=x;
        top++;
    }
}

char Stack::pop()
{
    if(top==0){
        cout << "Stack bereits leer!" << endl;
    }
    else{
        top--;
        return content[top];
    }

    // Hier willst du dir übrigens überlegen, was du zurückgibst, wenn der Stack leer ist
}

bool Stack::isEmpty() const
{
    if(top!=0)
        return false;
    else
        return true;
}


Was das Alloziieren angeht, schreib nen Kon- und Destruktor:

C++:
class Stack {
  ...
public:
  Stack(int size); // evtl. sinnvoll, den explicit zu machen, aber das ist für den Moment egal
  ~Stack();

  ...
};


und in der .cpp

C++:
Stack::Stack(int size) : depth(size) {
  content = new char[depth];
}

Stack::~Stack() {
  delete[] content;
}


...und dann in der main mit

C++:
int main()
{
    Stack s(3);

    s.push('a');
    s.push('b');
    s.push('c');
    s.push('d');
    while (! s.isEmpty())
        cout << s.pop() << endl;
    s.pop();

    cin.ignore();

    // s wird automatisch am Blockende zerstört, dabei wird
    // der Destruktor (Stack::~Stack()) ausgeführt
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 05.11.2007 um 20:27 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: