enum Simbolo { OPERANDO, PIZQ, PDER, SUMRES, MULTDIV, POW };
class NotacionPolaca
{
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);
int i, pos = 0;
for (i = 0; i < Epos.Length; i++)
{
char car = EI[i];
Simbolo actual = Tipo_y_Precedencia(car);
switch (actual)
{
case Simbolo.OPERANDO: Epos[pos++] = car; break;
case Simbolo.SUMRES:
{
while (!stack.EstaVacia && Tipo_y_Precedencia((char)stack.Tope) >= actual)
Epos[pos++] = (char)stack.Pop();
stack.Push(car);
}
break;
case Simbolo.MULTDIV:
{
while (!stack.EstaVacia && Tipo_y_Precedencia((char)stack.Tope) >= actual)
Epos[pos++] = (char)stack.Pop();
stack.Push(car);
}
break;
case Simbolo.POW:
{
while (!stack.EstaVacia && Tipo_y_Precedencia((char)stack.Tope) >= actual)
Epos[pos++] = (char)stack.Pop();
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;
case Simbolo.PIZQ: stack.Push(car); break;
}
}
while (!stack.EstaVacia)
{
if (pos < Epos.Length)
Epos[pos++] = (char)stack.Pop();
else
break;
}
StringBuilder regresa = new StringBuilder(EI);
for (int B = 0; B < Epos.Length; B++)
regresa[B] = Epos[B];
return regresa;
}
public Simbolo Tipo_y_Precedencia(char n)
{
Simbolo simbolo;
switch (n)
{
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.OPERANDO; break;
}
return simbolo;
}
public static bool ExpresionPostfija(string r, ref int res)
{
Pila<int> p =new Pila<int>(r.Length);
int op1 = 0, op2 = 0;
for (int i = 0; i < r.Length; i++)
if (!(r[i] == '+' || r[i] == '-' || r[i] == '*' || r[i] == '/' ||r[i]=='^'|| r[i] >= '0' && r[i] <= '9'))
return false;
if (r[i] == '+' || r[i] == '-' || r[i] == '*' || r[i] == '/' || r[i] == '^')
{
if (p.Pop(ref op2) && p.Pop(ref op1))
p.Push(Res(r[i], op1, op2));
else
return false;
}
if (r[i] >= '0' && r[i] <= '9')
{
p.Push(Convert.ToInt32(r[i].ToString()));
}
}
p.Pop(ref res);
return true;
}
public static int Res(char op,int op1, int op2)
{
switch (op)
{
case '+':
return op1 + op2;
case '-':
return op1 - op2;
case '*':
return op1 * op2;
case '/':
return op1 / op2;
case '^':
return Convert.ToInt32(Math.Pow(op1, op2));
}
return 0;
}
}
}