Error converting an infix expression to fixed post

0

Hello, I personally need to read an infix expression and convert it to postfix. I've reviewed the code several times but I can not find the error.

When I pass an expression for example: a + b, it returns me ab. I needed to return ab +.

I think my error is in this code snippet, but I can not think of a way to solve it.

while(1){
     valor = pop(p);
     if(valor == 0 ){
       printf("Lista vazia");
       break;
     }else{
     if(prioridade(item)){
       push(p, valor);
       push(p, item);
       break;
     }
     else{
       printf("%c", valor);
     }
   }

Follow my complete code:

#include<stdio.h>
#include<stdlib.h>
// Definição da Estrutura Lista Linear Simplemente Encadeada
typedef struct Bloco
{
  char dado;
  struct Bloco *prox;
}Pilha;

void inicializa_lista(Pilha **topo)//inicializa a lista
{
  *topo = NULL;
}


Pilha * Cria_Pilha() //aloca memória para o Pilha
{
  Pilha *p;
  p = (Pilha *) malloc(sizeof(Pilha));
  if(!p) {
    printf("Problema de alocação");
    exit(0);
  }
return p;
}

void push(Pilha **N, char dado) {
  Pilha *novo;
  novo = Cria_Pilha();
  novo->dado = dado;
  novo->prox = *N;
  *N = novo;
}

int pop(Pilha **topo) {
  Pilha *aux;
  if(*topo == NULL){ //verifica se a lista está vazia
    printf("A pilha esta vazia\n");
    exit(1);
  }else {
     aux = *topo;
      int valor = aux->dado;
      *topo = aux->prox;
      free(aux);
      return valor;
  }
 }

char imprime_pilha(Pilha *N) {
Pilha *aux;
if(N == NULL)
  printf("\n A lista está vazia!!");
 else {
   for(aux = N; aux != NULL; aux = aux->prox)
     printf("\n%d", aux->dado);
   }
}

char Infixa_Posfixa(char dado[], Pilha **p);
void menuop();
int prioridade(char c);

int main ()
{
  Pilha *Lista;
  int menu,n=0;
  char op[40];
  inicializa_lista(&Lista);
  int i=0;
  char caractere;
    printf("Digite uma expressão: ");
    do{
        setbuf(stdin,NULL);
        caractere = getchar();
        op[i]= caractere;
        i++;
    }while(caractere != '\n');

 do
 {
     menuop();// apenas mostrar as opções
     setbuf(stdin,NULL);
     scanf("%d", &menu);


    switch(menu)
    {
          case 1:
            Infixa_Posfixa(op,&Lista);
          break;
          case 2 :

          break;
          case 3 :

          break;
          case 4:

          break;
          case 5:
          break;

     }
    }while(menu != 5);
    return 1;
    free(Lista);
 }

 void menuop(){
   printf("\n1. Transforma uma expressão Infixa em Pósfixa ");
   printf("\n2. Transforma uma expressão Infixa em Préfixa ");
   printf("\n3. Lê uma expressão e informa se a expressão é válida ");
   printf("\n4. Lê uma expressão e informa o resultado da expressão 
   ");
   printf("\n5. Sair do Programa: ");
  }

 char Infixa_Posfixa(char dado[], Pilha **p)
 {
    char item ;
    int valor;
    int i=0;
    push(p,'(');
    do
    {
      item = dado[i];
      i++;
      if(item >= 'a' && item <= 'z')
      {
        printf("%c", item);
      } else if(item == '(') {
        push(p,'(');
      } else if(item == ')' || '
while(1){
     valor = pop(p);
     if(valor == 0 ){
       printf("Lista vazia");
       break;
     }else{
     if(prioridade(item)){
       push(p, valor);
       push(p, item);
       break;
     }
     else{
       printf("%c", valor);
     }
   }
'){ do { valor = pop(p); if(valor != '(') printf("%c\n",valor); }while(item !='('); }else if(item == '+' || item == '-' || item == '*' || item == '/' || item == '^' ) { while(1){ valor = pop(p); if(valor == 0 ){ printf("Lista vazia"); break; }else{ if(prioridade(item)){ push(p, valor); push(p, item); break; } else{ printf("%c", valor); } } } } }while(item != '
#include<stdio.h>
#include<stdlib.h>
// Definição da Estrutura Lista Linear Simplemente Encadeada
typedef struct Bloco
{
  char dado;
  struct Bloco *prox;
}Pilha;

void inicializa_lista(Pilha **topo)//inicializa a lista
{
  *topo = NULL;
}


Pilha * Cria_Pilha() //aloca memória para o Pilha
{
  Pilha *p;
  p = (Pilha *) malloc(sizeof(Pilha));
  if(!p) {
    printf("Problema de alocação");
    exit(0);
  }
return p;
}

void push(Pilha **N, char dado) {
  Pilha *novo;
  novo = Cria_Pilha();
  novo->dado = dado;
  novo->prox = *N;
  *N = novo;
}

int pop(Pilha **topo) {
  Pilha *aux;
  if(*topo == NULL){ //verifica se a lista está vazia
    printf("A pilha esta vazia\n");
    exit(1);
  }else {
     aux = *topo;
      int valor = aux->dado;
      *topo = aux->prox;
      free(aux);
      return valor;
  }
 }

char imprime_pilha(Pilha *N) {
Pilha *aux;
if(N == NULL)
  printf("\n A lista está vazia!!");
 else {
   for(aux = N; aux != NULL; aux = aux->prox)
     printf("\n%d", aux->dado);
   }
}

char Infixa_Posfixa(char dado[], Pilha **p);
void menuop();
int prioridade(char c);

int main ()
{
  Pilha *Lista;
  int menu,n=0;
  char op[40];
  inicializa_lista(&Lista);
  int i=0;
  char caractere;
    printf("Digite uma expressão: ");
    do{
        setbuf(stdin,NULL);
        caractere = getchar();
        op[i]= caractere;
        i++;
    }while(caractere != '\n');

 do
 {
     menuop();// apenas mostrar as opções
     setbuf(stdin,NULL);
     scanf("%d", &menu);


    switch(menu)
    {
          case 1:
            Infixa_Posfixa(op,&Lista);
          break;
          case 2 :

          break;
          case 3 :

          break;
          case 4:

          break;
          case 5:
          break;

     }
    }while(menu != 5);
    return 1;
    free(Lista);
 }

 void menuop(){
   printf("\n1. Transforma uma expressão Infixa em Pósfixa ");
   printf("\n2. Transforma uma expressão Infixa em Préfixa ");
   printf("\n3. Lê uma expressão e informa se a expressão é válida ");
   printf("\n4. Lê uma expressão e informa o resultado da expressão 
   ");
   printf("\n5. Sair do Programa: ");
  }

 char Infixa_Posfixa(char dado[], Pilha **p)
 {
    char item ;
    int valor;
    int i=0;
    push(p,'(');
    do
    {
      item = dado[i];
      i++;
      if(item >= 'a' && item <= 'z')
      {
        printf("%c", item);
      } else if(item == '(') {
        push(p,'(');
      } else if(item == ')' || '%pre%'){
        do
        {
          valor = pop(p);
          if(valor != '(')
          printf("%c\n",valor);
        }while(item !='(');
      }else if(item == '+' || item == '-' ||
         item == '*' || item == '/' ||
         item == '^' )
  {
    while(1){
     valor = pop(p);
     if(valor == 0 ){
       printf("Lista vazia");
       break;
     }else{
     if(prioridade(item)){
       push(p, valor);
       push(p, item);
       break;
     }
      else{
       printf("%c", valor);
      }
    }
  }
 }
    }while(item != '%pre%');
  }

int prioridade(char ch)
{
   switch(ch)
   {
    case '+':
    case '-':
      return 1;

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

     case '^':
       return 3;
     }
    return -1;
}
'); } int prioridade(char ch) { switch(ch) { case '+': case '-': return 1; case '*': case '/': return 2; case '^': return 3; } return -1; }
    
asked by anonymous 24.10.2018 / 23:25

0 answers