Buscando las cuatro operaciones aritméticas (entre paréntesis) compiladas en lenguaje C, con comentarios
#includelt;stdio.hgt;
#includelt;stdlib.hgt;
#define MaxOp 128
#define MaxSize 128
#define Tamaño 128
struct //Establecer prioridad del operador
{
char ch //Operador
int pri; //Prioridad
}
lpri[]={{'=', 0}, {'(', 1}, { '*', 5 }, {'/', 5}, {' ', 3}, {'-', 3}, {')', 6}},
rpri[]= {{'=' , 0}, {'(', 6}, {'*', 4}, {'/', 4}, {' ', 2}, {'-', 2}, {' )', 1} };
int leftpri(char op) //Encontrar la prioridad del operador izquierdo op
{
int i;
p>for(i=0;ilt;MaxOp;i)
if(lpri[i].ch==op)
return lpri[i].pri ; p>
}
int rightpri(char op) // Encuentra la prioridad del operador derecho op
{
int
for(i=0;ilt;MaxOp;i)
if(rpri[i].ch==op)
return rpri[i] .pri;
}
int InOp(char ch) //Determinar si ch es un operador
{
if(ch =='( '||ch==')'||ch==' '||ch=='-'||ch=='*'||ch=='/')
devuelve 1 ;
else
return 0;
}
int Precede(char op1, char op2) //op1 Estructura de comparación con op2 precedencia del operador
{
if(leftpri(op1)==rightpri(op2))
return 0;
else if( leftpri(op1)lt;rightpri(op2))
return -1;
else return 1;
} p>
void trans (char *exp, char postexp[])
//Convierte la expresión aritmética exp en la expresión postfix postexp
{
struct
{
char data[MaxSize]; // Operador de almacenamiento
int top; //Puntero de pila
}op;
//Definir pila de operadores
int i=0; //i se utiliza como subíndice de postexp
op.top=-1;
op. top ; //Empuja '=' en la pila
op.data[op.top]='=';
while(*exp!='\0') / /exp Bucle cuando la expresión no ha sido escaneada
{
if(!InOp(*exp)) //Si es un carácter numérico
{
while(*expgt;='0'amp;amp;*explt;='9') //determinado como un número
{
postexp [i ]=* exp;
exp ;
}
postexp[i ]='#'; cadena numérica
}
else
switch(Precede(op.data[op.top], *exp))
{
case -1: //La prioridad del operador en la parte superior de la pila es baja
op.top; /p>
exp; //Continuar escaneando otros caracteres
break;
case 0: //Solo los corchetes satisfacen esta situación
op.top --; //Saldrá de la pila
exp;
break
caso 1:
postexp[i ]= op.data[op.top];
op.top--;
descanso
}
}
while(op.data[op.top ]!='=') // En este momento, el escaneo exp se completa y la pila regresa a '='
{
postexp[i ]=op.data[op.top] ;
op.top--;
}
postexp [i]='\0'; //Agrega un indicador de fin a la expresión postexp p>
}
float compvalue(char *postexp) //Calcula el valor de la expresión postfix postexp
{
estructura
{
flotador
data[MaxSize]; // Valor de almacenamiento
int top; //Puntero de pila
}st;
float d, a, b, c; /p>
st.top=-1;
while(*postexp!='\0') //Bucle cuando la cadena postexp no ha sido escaneada
{
cambiar(*postexp)
{
caso ' ':
a=st.data[st.top];
p>
st.top--
b=st.data[st.top]
st.top--; p>
c = a b;
st.top ;
st.data[st.top]=c
descanso
caso '-':
a=st.data[st.top]
st.top--; .data[st.top ];
st.top--;
c=b-a
st.top; st.data[st.top]=c;
descanso;
caso '*':
a=st.data[st.top];
st.top--;
b=st.data[st.top]
st.top--; > c=a*b ;
st.top ;
st.data[st.top]=c;
descanso;
caso '/' :
a=st.data[st.top];
st.top--; [st.top];
st.top--;
if(a!=0)
{
c= b/a;
p>
st.top;
st.data[st.top]=c
}
más
{
printf("\n\tDivisión por cero error! \n"
exit(0
}
romper;
predeterminado:
d=0;
while(*postexpgt;='0'&*postexplt;='9' )
{
d=10*d *postexp-'0';
postexp
}
st.top;
st.data[st.top]=d;
descanso
}
postexp; p>
}
return(st.data[st.top]);
}
void main()
{
for(;;)
{
char exp[Tamaño]
char postexp[MaxSize] ; p>
printf("Ingrese la expresión: ");
gets(exp);
trans(exp, postexp); ("Expresión infija: s\n", exp);
printf("Expresión postfija: s\n", postexp);
printf("Expresión El valor de la fórmula); : g\n", valorcomp(postexp));
}
}