Domanda Conversione da notazione infissa a polacca invera

Stato
Discussione chiusa ad ulteriori risposte.

Consilvio

Utente Silver
18 Dicembre 2013
100
13
3
65
Ultima modifica da un moderatore:
Salve recentemente ho scritto un piccolo programma che converte espressioni relativamente semplici dalla notazione infissa ( 3+4) a quella polacca inversa( 3 4 +) . Il programma però mi da strani output , a volte mi da un risultato perfetto altre no altre ancora va in segmentation fault. Non riesco a capire se il problema sia il buffer stdin o cos'altro se qualcuno può illuminarmi gliene sarei molto grato. Allego il codice.

C:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 55
struct stackNode{
    char data;
    struct stackNode *nextPtr;
};
typedef struct stackNode StackNode;
typedef StackNode *StackNodePtr;

void push(StackNodePtr *topPtr,char value);
char pop(StackNodePtr *topPtr);
int isOperator(char c);
int precedence(char operator1,char operator2);
void printStack(StackNodePtr currentPtr);
int isEmpty(StackNodePtr topPtr);
char stackTop(StackNodePtr topPtr);
void convertToPostfix(char infix[],char postfix[]);

int main(void){
    char infix[SIZE];
    char postfix[SIZE];
    printf("\nInserisci un 'espressione: ");
    char a;
    int i=0;
    while((a=getchar()) != '\n'){
        infix[i] = a;
        i++;
        }
    infix[i]=')';
    for(i=0;i<SIZE;i++){
        postfix[i]=' ';
    }
    convertToPostfix(infix,postfix);
    putchar('\n');
    for(int i=0;i<SIZE;i++){
        if(postfix[i] != ' '){
        printf("%c ",postfix[i]);}
    }
  
}
void convertToPostfix(char infix[],char postfix[]){
    StackNodePtr topPtr = NULL;
    char a;
    int i=0;
    push(&topPtr,'(');
    while(isEmpty(topPtr) != 1){
        for(i=0;i<SIZE;i++){
            if(isdigit(infix[i]) != 0){
                postfix[i+1]= infix[i];
            }
            else if(infix[i] == '('){
                push(&topPtr,'(');
            }
            else if( isOperator(infix[i]) == 1){
                a = stackTop(topPtr);
                while(isOperator(a)== 1 && precedence(a,infix[i]) != -1){
                    a = pop(&topPtr);
                    postfix[i+1] = a;
                    a = stackTop(topPtr);
                }
                push(&topPtr,infix[i]);
            }
            else if( infix[i] == ')'){
                int counter =i;
                while(topPtr->data != '('){
                    a= pop(&topPtr);
                    postfix[counter+1]= a;
                    counter++;
                    }
                    pop(&topPtr);
                }
            else{
                }

          
          
      
    }
    }
}
                  
                  
                  
  
  
  
char stackTop(StackNodePtr topPtr){
    char value;
    value = topPtr->data;
    return value;
}
int isEmpty(StackNodePtr topPtr){
    if(topPtr!=NULL){
        return 0;}
    else{
        return 1;
    }
}
void printStack(StackNodePtr currentPtr){
    while(currentPtr != NULL){
        printf(" %c",currentPtr->data);
        currentPtr = currentPtr->nextPtr;
    }
}
int precedence(char operator1,char operator2){
    switch(operator1){
        case '+':
            switch(operator2){
                case '+':
                    return 0;
                    break;
                case '-':
                    return 0;
                    break;
                default:
                    return -1;
                }
                break;
        case '-':
            switch(operator2){
                case '+':
                    return 0;
                    break;
                case '-':
                    return 0;
                    break;
                default:
                    return -1;
                }
                break;
        case ('/'):
            switch(operator2){
                case '+':
                    return 1;
                    break;
                case '-':
                    return 1;
                    break;
                case '/':
                    return 0;
                    break;
                case '*':
                    return 0;
                    break;
                case '%':
                    return 0;
                    break;
                default:
                    return -1;
                }
            break;
        case ('*'):
            switch(operator2){
                case '+':
                    return 1;
                    break;
                case '-':
                    return 1;
                    break;
                case '/':
                    return 0;
                    break;
                case '*':
                    return 0;
                    break;
                case '%':
                    return 0;
                    break;
                default:
                    return -1;
                }
            break;
        case ('%'):
            switch(operator2){
                case '+':
                    return 1;
                    break;
                case '-':
                    return 1;
                    break;
                case '/':
                    return 0;
                    break;
                case '*':
                    return 0;
                    break;
                case '%':
                    return 0;
                    break;
                default:
                    return -1;
                }
            break;
        case '^':
            return 1;
            break;
        default :
            return 5;
        }
    }
              
  
int isOperator(char c){
    switch(c){
        case '+' :
            return 1;
            break;
        case '-' :
            return 1;
            break;
        case '*':
            return 1;
            break;
        case '/' :
            return 1;
            break;
        case '%':
            return 1;
            break;
        case  '^':
            return 1;
            break;
        default:
            return 0;
        }
    }
void push(StackNodePtr *topPtr,char value){
    StackNodePtr newPtr;
    newPtr =malloc(sizeof(StackNode));
    if(newPtr != NULL){
        newPtr->data = value;
        newPtr->nextPtr = *topPtr;
        *topPtr = newPtr;
    }
    else{
        printf("\nNo memory available");
    }
}

char pop(StackNodePtr *topPtr){
    StackNodePtr tempPtr;
    char popValue;
    tempPtr = *topPtr;
    popValue = (*topPtr)->data;
    *topPtr = (*topPtr)->nextPtr;
    free(tempPtr);
    return popValue;
}
 
Ultima modifica:
C:
while((a=getchar()) != '\n'){

Ho sempre detestato la possibilità che il C offre di poter effettuare contemporaneamente l'assegnazione e un confronto, in quanto i compilatori non sempre la interpretano correttamente. Ti consiglio di modificarla in:

C:
char a=getchar();
int i=0;
while(a!='\n'){
infix[i]=a;
i++;
a=getchar();
}

C:
infix[i]=')';
questo non riesco a spiegarmelo EDIT: ora ho capito

Prova ad eseguire questa modifica, e fammi sapere se il problema persiste. Appena ho tempo lo analizzerò più approfonditamente in quanto l'algoritmo non è sicuramente tra i più semplici
 
Stato
Discussione chiusa ad ulteriori risposte.