programmierung einer scriptsprache:simulieren des stapels



  • hmm stack hab ich ja auch in betracht gezogen,doch dann gibts dieses problem:

    //erstmal die schrittweise abarbeitung der rechnung 1*2-3*4
    m_stack.push(1*2);//m steht für modifiziert, dh nach jedem top() wird der oberste wert gelöscht
    m_stack.push(3*4);
    m_stack.top()-m_stack.top();
    

    hierbei kommt nicht raus was erwartet wird,zwar werden im modifizierten stack die werte nach ihrem auslesen korrekt gelöscht,aber sie haben die falsche reihenfolge, sodass aus 1*2-3*4 3*4-1*2 wird, man müsste also rein theoretisch den parsebaum spiegeln, aber das ist sehr komplex...



  • warum nicht so:

    int x,y;
    m_stack.push(1*2);
    m_stack.push(3*4);
    x = m_stack.top();
    m_stack.pop();
    y = m_stack.top();
    m_stack.pop();
    m_stack.push(y - x);
    

    Die Funktionsweise von std::stack muss man natürlich kennen, sonst wird das nix.



  • @ bashar hmm hab ichd as nich gesagt?

    test(a,b);
        test(1,2);
        int x,y
        x=container.top();
        container.pop();
        y=container.top();
        container.pop();
        test(x,y)//etwas umständlich und wenig oop,aber is natürlich gut möglich
    //aber so meinte ich das^^
    T m_x::top(){
        T value=container.top();
        container.pop();
        return value;    
    }
    test(m_x.top(),m_x.top());
    

    ich weis wie stack funktioniert, du musst mir das net erklären,deshalb hab ich ja schon von den modifikationen gesprochen,damit automatisch pop aufgerufen wird.



  • Implementir die Operatoren doch einfach als Funktionen. Also du push einfach 1 und 2 auf den Stack und du rufest * auf. Dann pushst du den return Wert auf den Stack. Nun pushs du 3 und 4 auf den Stack unf rufest * auf. Nun pushs du den return Wert auf den Stack und rufest + auf. Wenn du jetzt am Ende des Statements angekommen bist lässt du den return Wert fallen, das heist du veränderst ihn nicht und er wird nächstes Mal überschrieben, wenn es allerdings noch nicht das Ende ist : auf den Stack damit und weiter aufrufen.



  • RPN (Reverse Polish Notation) verwenden, da hast du solche probs nicht, brauchst du nur 3 register... 🙂



  • klar, die postfix notation kenn ich, halt dass beim rpn noch gedreht wird...

    //edit ändert natürlich nichts dran, dass ich trotzdem noch den stack simulieren muss, da ich keinen zugriff auf die register hab 😉



  • ich meine jetzt keine CPU-Register, sondern einfach variablen x, y und z



  • todo schrieb:

    ich meine jetzt keine CPU-Register, sondern einfach variablen x, y und z

    was meinste, wo eine normale variable wie int i; im speicher liegt? 😉 auf dem stack, und den muss ich simulieren,da mir solche sachen ja zur compilezeit des programms nicht bekannt sind, wie gesagt scriptsprache 😃



  • nein, um mittels RPN normale Formeln auszurechnen, brauchst du nur die drei variablen x, y, z ein stack ist (zumindest bei diesem ansatz) völlig überdimensioniert... und x, y und z kannst du fest deklarieren, von mir aus auch anders benennen...



  • nein falsch, war quark, schau dir das mal an, da wird auch ein stack benutzt:

    http://www.free2code.net/code/cpp/11/code_245.php

    oder das (is allerdings perl)

    http://home.earthlink.net/~jrhay/src/perl/equation

    oder verwirf mein ansatz und mein gelaber ganz, ist wahrscheinlich das beste 🙂


Anmelden zum Antworten