#include<stdio.h>
#include<stdlib.h>
#include<string.h>
enum{DIVCERO=1};
const char *msjerror[]={"Division por cero"};
int erroreval=0;
struct pila{
int n;
struct pila *sig;
};
void apilar(struct pila **cabeza, int n);
struct pila *nuevoElemento();
int desapilar(struct pila **cabeza);
int pilaVacia(struct pila *cabeza);
int operacion(int n1, int n2, char caract);
void conversion(struct pila **cabeza, char cad[]);
void mostrarPila(struct pila **cabeza);
int main(void)
{
int res;
struct pila *operandos=NULL;
char expresion[15];
printf("nIntroduce la expresion separada por espacios: "); conversion(&operandos, expresion);
mostrarPila(&operandos);
if(erroreval)
{
printf("Error de evaluacion: %sn",msjerror
[erroreval
-1]); }
else
{
res=desapilar(&operandos);
printf("nEl resultado de la expresion es: %dn", res
); }
return 0;
}
struct pila *nuevoElemento()
{
return (struct pila
*)malloc(sizeof(struct pila
)); }
void apilar(struct pila **cabeza, int n)
{
struct pila *nuevo=NULL;
nuevo=nuevoElemento();
nuevo->n=n;
nuevo->sig=*cabeza;
*cabeza=nuevo;
}
int desapilar(struct pila **cabeza)
{
int n;
struct pila *aux=NULL;
n=(*cabeza)->n;
aux=*cabeza;
*cabeza=aux->sig;
return n;
}
int pilaVacia(struct pila *cabeza)
{
if(cabeza==NULL)
return 0;
return 1;
}
int operacion(int n1, int n2, char caract)
{
int r;
erroreval=0;
if(caract=='*')
r= n1*n2;
if(caract=='-')
r= n1-n2;
if(caract=='+')
r= n1+n2;
if(caract=='/')// verificar que n2 no sea 0
{
if(n2!=0)
r= n1/n2;
else
erroreval=DIVCERO;
}
return r;
}
void conversion(struct pila **cabeza, char cad[])
{
int n1, n2, nuevo, i=0;
while(cad[i]!='f'){
if(cad[i]>='0' && cad[i]<='9') // es digito?
apilar(cabeza, cad[i]-'0'); // convertir a entero antes de apilar
if(cad[i]=='+' || cad[i]=='-' ||
cad[i]=='*' || cad[i]=='/'){// es operacion?
n2=desapilar(cabeza);
n1=desapilar(cabeza);
nuevo=operacion(n1, n2, cad[i]);
apilar(cabeza, nuevo);
}
i++;
}
}
void mostrarPila(struct pila **cabeza)
{
struct pila *aux=NULL;
aux=*cabeza;
while(aux!=NULL){
aux=aux->sig;
}
}