Algoritmia - convertir notacion Infija a postfija

 
Vista:

convertir notacion Infija a postfija

Publicado por Alex (2 intervenciones) el 22/09/2002 03:28:12
necesito convertir expresiones matematicas de notacion infija a postfija
utilizando pilas y colas
ej.
infija ( (A * B ) + C)
Postfija AB * C +
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:convertir notacion Infija a postfija

Publicado por Néstor (3 intervenciones) el 22/09/2002 09:54:39
La idea del algoritmo es más o menos asi:

Tengo una pila y una cola inicialmente vacías, la pila la uso para trabajar con la fórmula infija, y la cola tiene el resultado en polaco

Apilas la fórmula (infija)
Mientras la pila no sea vacia
1
2
3
4
5
6
7
8
F = Tope
     Si el tope es un número o variable, o un operador
          Encolo F
     Si no (o sea es una fórmula)
          Encuentro el operador principal
          Apilo el operador
          Apilo la subfórmula derecha
          Apilo la subfórmula izquierda

Ej: A + (B * C + D)
Pila: A + (B * C + D)
Cola: []
Desapilo, reviso el operador principal (el primer +) y apilo

Pila: A
(B*C+D)
+
Cola: []
Desapilo, cómo es una variable la encolo

Pila: (B*C+D)
+
Cola: A
Desapilo, reviso el operador principal (el +) y apilo

Pila: B*C
D
+
+
Cola: A
Desapilo, reviso el operador principal (el *) y apilo
Pila: B
C
*
D
+
+
Cola: A
Ya no quedan fórmulas, asi que las próximas iteraciones hasta vaciar la pila solo sacan el tope y lo agregan a la cola
Pila:
Cola: ABC*D++

El algorítmo es fácil de hacer salvo por la parte en la que tenés que encontrar el operador principal de la fórmula, si no tenés paréntesis es fácil, pero con paréntesis es un poco más complicado, si tenés problemas con eso avisame.

Saludos%
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por tengo (1 intervención) el 22/12/2002 00:09:20
O también puedes buscar por notación RPN o visitar este link: http://xvoid.iespana.es (actualmente updating creo).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por paoly (1 intervención) el 21/09/2007 19:59:10
por favor necesito urgente el programa para convertir de notacion infija a posfija
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por Albeiro (1 intervención) el 12/03/2010 01:53:46
pasate por aca.... mira al final del foro

http://grupos.emagister.com/debate/evaluacion_y_conversion_de_expresiones_infija_postfija_y_prefija_/6709-289712
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por david (1 intervención) el 12/11/2010 02:22:36
necesito la conversion de infija a postfija
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por maria elena (1 intervención) el 28/03/2006 02:40:17
oyes si conseguistes el programa para que me lo pases si por fis.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por rafa (1 intervención) el 01/09/2006 22:36:17
Yo buscaba lo mismo y aunqe todavía no hago el programa, me pareció bien compartir lo qe he encontrado. Espero qe sea de utilidad para los qe vean este foro.

Eso lo encontré en http://www.itlp.edu.mx/publica/tutoriales/estru1/33.htm

ALGORITMO PARA CONVERTIR EXPRESIONES INFIJAS EN POSTFIJAS (RPN)

1. Incrementar la pila
2. Inicializar el conjunto de operaciones
3. Mientras no ocurra error y no sea fin de la expresión infija haz
* Si el carácter es:
1. PARENTESIS IZQUIERDO. Colocarlo en la pila
2. PARENTESIS DERECHO. Extraer y desplegar los valores hasta encontrar paréntesis izquierdo. Pero NO desplegarlo.
3. UN OPERADOR.
o Si la pila esta vacía o el carácter tiene más alta prioridad que el elemento del tope de la pila insertar el carácter en la pila.
o En caso contrario extraer y desplegar el elemento del tope de la pila y repetir la comparación con el nuevo tope.
4. OPERANDO. Desplegarlo.
4. Al final de la expresión extraer y desplegar los elementos de la pila hasta que se vacíe.

ALGORITMO PARA EVALUAR UNA EXPRESION RPN

1. Incrementar la pila
2. Repetir
* Tomar un caracter.
* Si el caracter es un operando colocarlo en la pila.
* Si el caracter es un operador entonces tomar los dos valores del tope de la pila, aplicar el operador y colocar el resultado en el nuevo tope de la pila. (Se produce un error en caso de no tener los 2 valores)
3. Hasta encontrar el fin de la expresión RPN.

Y si en el siguiente link viene una explicación con ejemplos fácil de entender (no lo puse porqe tiene tablas, las cuales no se pueden poner aqí):

http://www.ii.uam.es/~ccastaneda/ENUNCIADOSEJE4.doc.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por daniel (2 intervenciones) el 15/10/2007 22:53:57
necesito un programa que me convierta una expresion infija a posfija en c++ y que al imprimir el programa me pida la expresion y que me muestre los caracteres los topes de pila,la expresion posfija y el resultado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por daniel (2 intervenciones) el 15/10/2007 22:55:21
necesito un programa que me convierta una expresion infija a posfija en c++ y que al imprimir el programa me pida la expresion y que me muestre los caracteres los topes de pila,la expresion posfija y el resultado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por randy (1 intervención) el 10/03/2009 14:31:10
me urge el programa mas tardar hoy.....................
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por Alberto Hondal Hernandez (1 intervención) el 19/06/2009 21:51:24
Necesito en C# el codigo de convertir a notacion posfija,gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por Yaneit (1 intervención) el 23/09/2009 14:42:53
necesito un programa que me convierta una expresion infija a posfija en c++ y que al imprimir el programa me pida la expresion y que me muestre los caracteres los topes de pila,la expresion posfija y el resultado porfis...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por dios (1 intervención) el 05/11/2009 16:25:35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
 
typedef enum {False,True} bool;
typedef enum {izq,igual,der,none} Par;
 
char Simb[4][3]={{'(',')','\0'},{'-','+','\0'},{'/','*','\0'},{'^','\0','\0'}};
 
void Clear(char [],int ),
Add(char [],char []),
Append(char [],char ),
Rec_Exp_Pos(char []),
Conv_Pos(char [],char []),
Invertir(char []),
Rec_Exp_Pre(char []),
Input(char []),
Conv_Pre(char [],char []);
 
int Priority(char,char),
length(char []);
 
Par Ver_Cad(char []);
bool IfSimb(char);
 
void main(){
char Exp[50],E1[50],E2[50],EPOS[50],EPRE[50];
clrscr();
Clear(EPRE,50);
Clear(EPOS,50);
Clear(E1,50);
Clear(E2,50);
do{
printf("%s","Introduzca la expresi¢n infija: ");
Input(Exp);
if(Ver_Cad(Exp)!=igual){
printf("La expresi¢n \'%s\' no es v lida",Exp);
switch(Ver_Cad(Exp)){
case izq:printf(" le faltan par‚ntesis derechos.");break;
case der:printf(" le faltan par‚ntesis izquierdos.");break;
case none:printf(" ya que no es f£nci¢n v lida.");break;}
getch();
clrscr();
}
}while(Ver_Cad(Exp)!=igual);
Add(E1,Exp);
Add(E2,Exp);
Conv_Pre(E1,EPRE);
/*Invertimos la Expresi¢n*/
Invertir(EPRE);
printf("%s %s\n","Su conversi¢n a Prefija es: ",EPRE);
Conv_Pos(E2,EPOS);
printf("%s %s\n","Su conversi¢n a Postfija es: ",EPOS);
getch();
}
 
/*Hace lo mismo que Scanf("%[^\n]",Exp)*/
void Input(char Exp[]){
int i;
for(i=0;(Exp[i] = getchar()) != '\n';++i);
Exp[i]='\0';
}
 
/*Esta funci¢n limpia n espacios en Text*/
void Clear(char Text[],int n){
int i;
for(i=0;i<n;i++)
Text[i]='\0';
}
 
/*Calcula la prioridad entre exp1 y exp2 

-1 si exp1 < exp2 
0 si exp1 == exp2 
1 si exp1 > exp2*/
int Priority(char exp1,char exp2){
int i,j,p1,p2;
for(i=0;i<4;i++)
for(j=0;j<3;j++){
if(exp1==Simb[i][j])
p1=i;
if(exp2==Simb[i][j])
p2=i;
}
if(p1<p2)
i=-1;
else
if(p1==p2)
i=0;
else
if(p1>p2)
i=1;
return(i);
}
 
/*Hace lo mismo que strlen(text)*/
int length(char text[]){
int n;
for(n=0;text[n]!='\0';++n);
return(n);
}
 
/*Agrega la cadena B en A*/
void Add(char A[],char B[]){
int n1,n2,i;
n1=length(A);
n2=length(B);
for(i=n1;i<(n1+n2);i++)
A[i]=B[i-n1];
A[i]='\0';
}
 
/*Verifica si text es una cadena v lida*/
Par Ver_Cad(char text[]){
int i,n,cont1,cont2,TOPE;
char PILA[50],elem;
Par val=none;
n=length(text);
if(n>0){
TOPE=0;
cont1=cont2=0;
for(i=0;i<n;i++){
elem=text[i];
if(elem=='('){
PILA[TOPE]=elem;
TOPE+=1;
PILA[TOPE]='\0';}
else
if(elem==')')
if(TOPE>0){
if(PILA[TOPE-1]=='('){
TOPE-=1;
PILA[TOPE]='\0';}
}else{
PILA[TOPE]=elem;
TOPE+=1;
PILA[TOPE]='\0';}
}
if(TOPE>0){
for(i=0;i<TOPE;i++){
if(PILA[i]=='(')
cont1+=1;
if(PILA[i]==')')
cont2+=1;
}
if(cont1<cont2)
val=der;
if(cont1>cont2)
val=izq;
}
else
val=igual;
}else
val=none;
return(val);
}
 
/*Verifica si Expr es simbolo o no*/
bool IfSimb(char Expr){
int i,j;
bool val;
val=False;
for(i=0;i<4;i++)
for(j=0;j<3;j++)
if(Expr==Simb[i][j])
val=True;
return(val);
}
 
/*Agrega un caracter a la cadena Exp1*/
void Append(char Exp1[],char Exp2){
int n;
n=length(Exp1);
Exp1[n]=Exp2;
}
 
/*Invierte el sentido de una cadena de caracteres*/
void Invertir(char Expr[]){
int i,n;
char *var;
n=length(Expr);
var=(char *) malloc((n+1)*sizeof(char));
for(i=0;i<n;i++)
*(var+(n-i)-1)=Expr[i];
for(i=0;i<n;i++)
Expr[i]=*(var+i);
*(var+i)='\0';
free(var);
}
 
/*Elimina el £ltimo elemento de Text*/
void Rec_Exp_Pre(char Text[]){
int n;
n=length(Text);
Text[n-1]='\0';}
 
/*Convierte una expresion EI (Infija) a una espresi¢n EPRE (Prefija)*/
void Conv_Pre(char EI[],char EPRE[]){
int TOPE,n;
char Simbolo,PILA[50];
Clear(PILA,50);
/*Hacer TOPE <- -1*/
TOPE=-1;
n=length(EI);
/*Mientras EI sea diferente de la cadena vac¡a*/
while(EI[0]!='\0'){
n-=1;
/*Tomamos el s¡mbolo m s a la derecha*/
Simbolo=EI[n];
/*Recortamos la expresi¢n*/
Rec_Exp_Pre(EI);
/*Si el s¡mbolo es par‚ntesis derecho*/
if(Simbolo==')'){
TOPE+=1;
/*Colocamos el s¡mbolo en la pila*/
PILA[TOPE]=Simbolo;
}
else
/*Si el s¡mbolo es izquierdo*/
if(Simbolo=='('){
while(PILA[TOPE]!=')'){
Append(EPRE,PILA[TOPE]);
PILA[TOPE]='\0';
TOPE-=1;
}
/*Sacamos el par‚ntesis de la pila*/
PILA[TOPE]='\0';
TOPE-=1;
}
else
/*Si es operando*/
if(IfSimb(Simbolo)==False){
Append(EPRE,Simbolo);
}
else{
/*Si la pila contiene algo*/
if(length(PILA)>0){
/*Mientras el operador sea < al que se encuentra 
al tope de la pila*/
while(Priority(Simbolo,PILA[TOPE])<0){
/*Agregar lo que hay en el tope de la pila*/
Append(EPRE,PILA[TOPE]);
/*Eliminamos lo que hay en el tope de la pila*/
PILA[TOPE]='\0';
TOPE-=1;
if(TOPE<0)
break;
}
}
TOPE+=1;
/*Agregamos el s¡mbolo al tope de la pila*/
PILA[TOPE]=Simbolo;
}
}
/*Agregamos lo que qued¢ en la pila*/
while(TOPE>=0){
Append(EPRE,PILA[TOPE]);
TOPE-=1;
}
}
 
/*Elimina el primer elemento*/
void Rec_Exp_Pos(char Text[]){
int i,n;
n=length(Text);
for(i=0;i<(n-1);i++)
Text[i]=Text[i+1];
Text[i]='\0';}
 
/*Convierte una epresion EI (Infija) a una expresion EPOS (Postfija)*/
void Conv_Pos(char EI[],char EPOS[]){
int TOPE,n;
char Simbolo,PILA[50];
Clear(PILA,50);
/*Hacer TOPE <- -1*/
TOPE=-1;
n=length(EI);
/*Repetir Mientras EI sea diferente a cadena vac¡a*/
while(EI[0]!='\0'){
/*Tomar el s¡mbolo m s a la izquierda de EI*/
Simbolo=EI[0];
/*Recortamos la Expresi¢n*/
Rec_Exp_Pos(EI);
n-=1;
/*Si el s¡mbolo es par‚ntesis izquierdo*/
if(Simbolo=='('){
/*Poner s¡mbolo en la pila*/
TOPE+=1;
PILA[TOPE]=Simbolo;
}
else
/*Si el s¡mbolo es par‚ntesis derecho*/
if(Simbolo==')'){
while(PILA[TOPE]!='('){
/*Agregamos lo que hay en el tope de la pila*/
Append(EPOS,PILA[TOPE]);
PILA[TOPE]='\0';
TOPE-=1;
}
/*Sacamos el par‚ntesis izquierdo de la pila*/
PILA[TOPE]='\0';
TOPE-=1;
}
else
/*Si es operando*/
if(IfSimb(Simbolo)==False){
/*Agregar contenido de Simbolo a EPOS*/
Append(EPOS,Simbolo);
}
else{
/*Si la Pila contiene algo*/
if(length(PILA)>0){
/*Mientras el operador sea <= al que se encuentra 
al tope de la pila*/
while(Priority(Simbolo,PILA[TOPE])<=0){
/*Agregar lo que hay al tope de la pila*/
Append(EPOS,PILA[TOPE]);
/*Borramos lo que hay al tope de la pila*/
PILA[TOPE]='\0';
TOPE-=1;
if(TOPE<0)
break;
}
}
/*Agregamos el s¡mbolo al tope de la pila*/
TOPE+=1;
PILA[TOPE]=Simbolo;
}
}
/*Agregamos lo que qued¢ en la pila*/
while(TOPE>=0){
Append(EPOS,PILA[TOPE]);
TOPE-=1;
}
}




este es el que nesecitas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

RE:convertir notacion Infija a postfija

Publicado por Yo (1 intervención) el 23/01/2011 21:52:05
Este código no puede compilar tal cual está en C++
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por pex (1 intervención) el 16/03/2012 19:10:20
Una cosa es que no compile y otra que no sepas

solo hay que cambiar
clrscr();

por
system ("cls");
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por asdf (1 intervención) el 11/06/2012 07:35:50
Gracias si compila muy bien el codigo =)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por emi (2 intervenciones) el 18/06/2012 22:28:11
Por favor es urgente, alguien me puede dar el codigo resuelto para crear un arbol en postfija?? y si tienen el codigo de evaluar la expresion seria fabuloso!!!!! muchas gracias y disculpas las molestias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ARBOL DE EXPRESIONES

Publicado por emi (2 intervenciones) el 18/06/2012 22:30:32
PERDON EL TITULO NO ES NOTACION INFIJA A POSTFIJA es el de arbol de expresiones xd
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ARBOL DE EXPRESIONES

Publicado por Juan C (2 intervenciones) el 21/06/2012 02:48:53
Hola alguien me puede dar pautas para poder pasar este codigo NOTACION INFIJA A POSTFIJA a Visual Basic
gracias o es lo mismo por fa ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por Juan C (2 intervenciones) el 21/06/2012 03:45:37
Hola alguien me puede dar pautas para poder pasar este codigo NOTACION INFIJA A POSTFIJA a Visual Basic
gracias o es lo mismo por fa ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ARBOL DE EXPRESIONES

Publicado por delia (1 intervención) el 14/09/2016 18:38:59
hola necesito un arbol de notacion infija a prefija
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:convertir notacion Infija a postfija

Publicado por uno que agradece (1 intervención) el 22/04/2014 17:36:21
Va de muerte!

XD

Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar