Infixa to Pósfixa conversion - C STACK

Asked

Viewed 397 times

0

Code that should be given an arithmetic expression in infix notation (common) for postsphere notation (reverse Polish). For example, when receiving (A+BC) he should print ABC+. The problem with my code is that when receiving "(A+BC)" he prints "ABC". Upon receiving "(A(B+C)/D-E)" it prints "ABCDE". In other compilers, the squares do not appear, but the return remains wrong. It does not give error, nor does it show any Warning. I think it gives segfault somewhere, but since I’m using repl.it to compile, I don’t have debug access.

The code is as follows::

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 256

typedef enum {FALSE, TRUE} BOOL;

typedef int TIPOCHAVE;

typedef struct {
    TIPOCHAVE chave;
} REGISTRO;

typedef struct {
    REGISTRO a[MAX];
    int topo;
} PILHA;

REGISTRO criarReg(TIPOCHAVE chave) {
    REGISTRO reg;
    reg.chave = chave;
    return reg;
}

void inicializar(PILHA *pilha) {
    pilha->topo = 0;
}

int vazia(PILHA *pilha) {
    return pilha->topo == 0;
}

int cheia(PILHA *pilha) {
    return pilha->topo == MAX;
}

void exibir(PILHA *pilha) {
    int i = 0;
    printf("Pilha: [");
    for (i=0; i<pilha->topo; i++) {
        printf("%d", pilha->a[i].chave);
        if (i < pilha->topo-1)
            printf(", ");
    }
    printf("] <-- topo\n");
}

int empilha(REGISTRO elem, PILHA *pilha) {
    if (cheia(pilha)) {
        return FALSE;
    }
    pilha->a[pilha->topo] = elem;
    pilha->topo++;
    return TRUE;
}

int desempilha(PILHA *pilha, REGISTRO *elem) {
    if (vazia(pilha))
        return FALSE;
    *elem = pilha->a[pilha->topo-1];
    pilha->topo--;
    return TRUE;
}

void esvaziar(PILHA *pilha) {
    pilha->topo = 0;
}

int topo(PILHA *pilha, REGISTRO *elem) {
    if (vazia(pilha))
    return FALSE;
    *elem = pilha->a[pilha->topo-1];
    return TRUE;
}


//função para checar se o caractere da string é um operando
int operando(char ch)
{
    return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z');
}

//função que determina a prioridade de cada operador
//valor retornado maior é igual a operador de prioridade maior
int prioridade(char ch)
{
    switch(ch)
    {
        case '+':
        case '-':
            return 1;

        case '*':
        case '/':
            return 2;

        case '^':
            return 3;
    }
    return -1;
}

//função que converte de infixa para posfixa
int inpos(char *expr)
{

    PILHA pilha;
    inicializar(&pilha);

    int i, aux;
    REGISTRO elem;

    for (i = 0, aux = 0; expr[i] != '\0'; i++)
    {
    //se o caractere escaneado for um operando, colocar no output.
    if (operando(expr[i]))
        expr[aux++] = expr[i];

    //se o caractere escaneado for um '(', empilhar.
    else if (expr[i] == '(')
        empilha(criarReg(expr[i]), &pilha);

    //se o caractere escaneado for um ')', desempilhar e mostrar até
    //um '(' ser achado.
    else if (expr[i] == ')')
    {
        while (!vazia(&pilha) && topo(&pilha, &elem) != '(')
            expr[aux++] = desempilha(&pilha, &elem);

            if (!vazia(&pilha) && topo(&pilha, &elem) != '(')
                return 0; //expressão inválida
            else
                desempilha(&pilha, &elem);
    }

    else    //um operador é encontrado
    {
        while (!vazia(&pilha) && prioridade(expr[i]) <= prioridade(topo(&pilha, &elem)))
            expr[aux++] = desempilha(&pilha, &elem);
        empilha(criarReg(expr[i]), &pilha);
    }
}
    //desempilha todos os elementos da pilha
    while (!vazia(&pilha))
        expr[aux++] = desempilha(&pilha, &elem);
    expr[aux++] = '\0';
    printf("%s", expr);
}

int main()
{
    char expr[60];

    fgets(expr, 60, stdin);
    inpos(expr);

    return 0;
}

What could be wrong?

  • Start by taking the compiler, compiling and correcting the warnings that appear, which are actually errors (at least 2 of them).

  • take a look at this src : Souce(RPN)

No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.