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;
}