Olá, eu fiz uma calculadora em C usando pilha. O erro é que, quando eu utilizo uma divisão, ele retorna o último valor digitado e não o resultado correto. Ex: 6/6 + 2 . Retorno: 2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct pilha{
char op;
struct pilha * proximo;
}Pilha;
typedef struct pilhaN{
int op;
struct pilhaN * proximo;
}PilhaN;
Pilha * posFixa=NULL;
Pilha * posFixaInv=NULL;
Pilha * temp=NULL;
PilhaN * calculo=NULL;
void calculaExpressao();
void empilhaN(PilhaN **pilha, int op);
void empilha(Pilha **pilha, char op);
void desempilhaN(PilhaN ** fPilha);
void desempilha(Pilha ** fPilha);
void transfereTempPos();
void imprime(Pilha *topo);
void calcula(char operador);
void inverte();
int main(){
char op;
printf( "Digite a expressao: " );
scanf( "%c", &op );
while( op != '\n' )
{
switch (op){
case '+':
case '-':
while((temp) && (temp->op != '(')){
transfereTempPos();
}
empilha(&temp,op);
break;
case '*':
case '/':
while((temp) && (temp->op != '+') && (temp->op != '-')
&& (temp->op != '(')) {
transfereTempPos();
}
empilha(&temp,op);
break;
case ')':
while((temp) && (temp->op != '(')){
transfereTempPos();
}
if((temp) && (temp-> op == '(')){
Pilha *aux;
aux = temp;
temp = temp->proximo;
free(aux);
}
break;
case '(':
empilha(&temp,op);
break;
default:
empilha(&posFixa,op);
break;
}
scanf( "%c", &op );
}
while(temp){
transfereTempPos();
}
imprime(posFixa);
printf( "\n" );
calculaExpressao();
printf( "\n" );
}
void empilha(Pilha ** fPilha, char op){
Pilha * aux;
aux = ( Pilha *) malloc( sizeof( Pilha ) );
aux -> op = op;
aux -> proximo = *fPilha;
*fPilha = aux;
}
void empilhaN(PilhaN ** fPilha, int op){
PilhaN * aux;
aux = ( PilhaN *) malloc( sizeof( PilhaN ) );
aux -> op = op;
aux -> proximo = *fPilha;
*fPilha = aux;
}
void desempilha(Pilha ** fPilha){
Pilha * aux;
aux = *fPilha;
*fPilha = (*fPilha)->proximo;
free(aux);
}
void desempilhaN(PilhaN ** fPilha){
PilhaN * aux;
aux = *fPilha;
*fPilha = (*fPilha)->proximo;
free(aux);
}
void transfereTempPos(){
Pilha *aux;
aux = temp->proximo;
temp->proximo = posFixa;
posFixa = temp;
temp = aux;
}
void imprime(Pilha *topo){
if( topo )
{
imprime( topo -> proximo );
printf( "%c", topo -> op );
}
}
void calcula(char operador){
int a,b,c;
a = calculo->op;
desempilhaN(&calculo);
b = calculo->op;
desempilhaN(&calculo);
switch (operador){
case '+': c = a + b;
break;
case '-': c = a - b;
break;
case '*': c = a * b;
break;
case '/': c = a / b;
break;
defalt:
break;
}
empilhaN(&calculo,c);
}
void calculaExpressao(){
inverte();
while(posFixaInv){
switch (posFixaInv->op){
case '+':
case '-':
case '*':
case '/':
calcula(posFixaInv->op);
break;
default:
empilhaN(&calculo,posFixaInv->op-48);
break;
}
desempilha(&posFixaInv);
}
printf("%i",calculo->op);
}
void inverte(){
Pilha * aux;
while(posFixa){
empilha(&posFixaInv,posFixa->op);
desempilha(&posFixa);
}
}