Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    18

    [C] Trasformazione espressione in notazione infissa a postfissa (RPN)

    Da qualche giorno sbatto la testa sull'algoritmo che permette di ottenere un'espressione in notazione postfissa (o reverse polish notation) partendo da una stringa in notazione prefissa per creare una calcolatrice. In particolare vorrei che lavorasse anche e soprattutto con numeri in virgola mobile. Nonostante la teoria mi è abbastanza chiara faccio degli errori nell'implementazione (non mi da nemmeno errori di compilazione).

    Riporto il codice:
    codice:
    void rpNotation (char *iString, char *oString) {
        int in = 0, out = 0;
        char tmpCh;
        stack lStack = stackInit (); /*la funzione si appoggia a uno stack creato da me a parte*/
    
        while ((tmpCh = iString [in]) != '\0') { /*salvo in tmpCh un carattere proveniente dalla stringa iString (in è un semplice indice)*/
        switch (tmpCh) {
        case '(':
            stackPush (lStack, tmpCh);
            break;
    
        case ')':
            tmpCh = stackPop (lStack);
            while (tmpCh != '(') {
            oString [out++] = tmpCh;
            tmpCh = stackPop (lStack);
            }
            break;
    
        case '+':
            while (showTop (lStack) != '(' || !stackEmpty (lStack)) {
            if (showTop (lStack) == '-' || '*' || '/') {
                oString [out] = ' ';
                out++;
                oString [out] = stackPop (lStack);
                out++;
            } else {
                stackPush (lStack, tmpCh);
                break;
            }
            }
            break;
    
        case '-':
            while (showTop (lStack) != '(' || stackEmpty (lStack)) {
                if (showTop (lStack) == '+' || '*' || '/') {
                oString [out] = ' ';
                out++;
                oString [out] = stackPop (lStack);
                out++;
            } else {
                stackPush (lStack, tmpCh);
                break;
            }
            }
            break;
    
        case '*':
            while (showTop (lStack) != '(' || stackEmpty (lStack)) {
            if (showTop (lStack) == '/') {
                oString [out] = ' ';
                out++;
                oString [out] = stackPop (lStack);
                out++;
            } else {
                stackPush (lStack, tmpCh);
                break;
            }
            }
            break;
    
        case '/':
            while (showTop (lStack) != '(' || stackEmpty (lStack)) {
            if (showTop (lStack) == '*') {
                oString [out] = ' ';
                out++;
                oString [out] = stackPop (lStack);
                out++;
            } else {
                stackPush (lStack, tmpCh);
                break;
            }
            }
            break;
    
        default:
            if (isdigit (tmpCh) || tmpCh == '.') {
            oString [out] = tmpCh;
            out++;
            }
        }
    
        in++;
        }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    18
    Quote Originariamente inviata da Krahos Visualizza il messaggio
    partendo da una stringa in notazione prefissa
    Naturalmente qui intendevo infissa.

  3. #3
    Puoi usare l'algoritmo operator precedence parsing per calcolare direttamente il risultato di un'espressione infissa senza doverla prima convertire in forma postfissa. Basta usare due stack: uno per gli operatori e uno per gli operandi:

    https://github.com/Vincenzo1968/OperatorPrecedenceParsing





  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    18
    Grazie, non conoscevo questo algoritmo, lo userò come alternativa nel caso in cui non riesca ad aggiustare il mio codice.

  5. #5
    Eventualmente puoi usare lo stesso algoritmo per trasformare l'espressione in notazione postfissa.
    Usi un solo stack, per gli operatori. I numeri vanno direttamente nella stringa di output:



    File allegati File allegati

  6. #6
    Ho aggiunto la funzione calcolate che prende in input l'espressione postfissa e ne calcola il risultato:

    File allegati File allegati

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    156
    Mi inserisco un attimo nella discussione. Ho dato un'occhiata all'algoritmo proposto, ma mi sembra che potrebbe dare un po' di problemi nel caso ci siano numeri negativi. Esempio : 3+2*(-4+2) questa espressione genererebbe un errore. Meglio adottare un diverso algoritmo (un po' di tempo fa ne avevo usato uno un po' più lungo, che teneva conto di questo e altri casi) o fare qualche modifica a questo?

  8. #8
    No, i numeri negativi vengono gestiti correttamente:




  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    18
    Grazie mille, mi è stato davvero utile. Invece a scopo didattico c'è qualcuno che abbia la pazienza di farmi capire cosa c'è di sbagliato nel mio codice?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.