viernes, 25 de noviembre de 2011

Notación Polaca

En este ejemplo se encuentra el código par convertir de una notacion normal a una notación polaca, el código es el siguiente

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;


enum Simbolo { OPRENANDO=0, PIZQ, PDER,SUMRES, MULTDIV, POW};
class Polaca
{
Este método es el que realiza todo el trabajo de convertir de una notación infija a una posfija (polaca)
public StringBuilder Convertir_a_Posfija(string Ei)
{
char[] Epos = new char[Ei.Length];
int tam = Ei.Length;
Pila<int> stack = new Pila<int>(Ei.Length);//para guardar el valor del operando
int i, pos = 0;
for (i = 0; i < Epos.Length; i++)
{
char car = Ei[i];
//simbolo actual = tipo y precedencia(car);

Simbolo actual = Tipo_y_Precedencia(car);

switch (actual)
{
case Simbolo.OPRENANDO: Epos[pos++] = car; break;

case Simbolo.SUMRES:
{
while(!stack.Vacia && Tipo_y_Precedencia((char)stack.Tope())>=actual)
Epos[pos++]= (char)stack.Pop();
stack.Push(car);
}
break;

case Simbolo.MULTDIV:
{
while (!stack.Vacia && Tipo_y_Precedencia((char)stack.Tope()) >= actual)
Epos[pos++] = (char)stack.Pop();
stack.Push(car);
}
break;

case Simbolo.POW:
{
while (!stack.Vacia && Tipo_y_Precedencia((char)stack.Tope()) >= actual)
Epos[pos++] = (char)stack.Pop();
stack.Push(car);
}
break;

case Simbolo.PIZQ: stack.Push(car); break;

case Simbolo.PDER:
{
char x = (char)stack.Pop();
while (Tipo_y_Precedencia(x) != Simbolo.PIZQ)
{
Epos[pos++] = x;
x = (char)stack.Pop();
}
}
break;
}
}

while (!stack.Vacia)
{
//por que esta ocasionando problemas con indice fuera de rango
if (pos < Epos.Length)
Epos[pos++] = (char)stack.Pop();
else
break;
}
StringBuilder regresa = new StringBuilder(Ei);
for(int r=0;r<Epos.Length;r++)
regresa[r] = Epos[r];
return regresa;
}

public Simbolo Tipo_y_Precedencia(char s)
{
Simbolo simbolo;
switch (s)
{
case '+': simbolo = Simbolo.SUMRES; break;
case '-': simbolo = Simbolo.SUMRES; break;
case '*': simbolo = Simbolo.MULTDIV; break;
case '/': simbolo = Simbolo.MULTDIV; break;
case '^': simbolo = Simbolo.POW; break;
case '(': simbolo = Simbolo.PIZQ; break;
case ')': simbolo = Simbolo.PDER; break;
default: simbolo = Simbolo.OPRENANDO; break;
}
return simbolo;
}
}

Si deseas revisar el proyecto descárgalo aquí:
http://www.mediafire.com/?7527lugw7beh1b6

No hay comentarios:

Publicar un comentario