Red de conocimiento informático - Conocimiento de la instalación - Buscando las cuatro operaciones aritméticas (entre paréntesis) compiladas en lenguaje C, con comentarios

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 ;

}

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;

}

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

}

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]

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

}

}