[C con Clase] para arturoz2008 en hotmail.com

inf200717 en ucf.edu.cu inf200717 en ucf.edu.cu
Vie Mayo 14 19:52:00 CEST 2010



Lo que planteas a solucionar es El algoritmo shunting yard y es un
método para analizar (parsing) las ecuaciones
matemáticas especificadas en la notación de
infijo. Puede ser utilizado para producir la salida en la notación polaca
inversa (RPN) o como árbol de
sintaxis abstracta (AST). El algoritmo fue inventado por Edsger
Dijkstra y nombró como algoritmo "shunting yard" (patio de
clasificación) porque su operación se asemeja al de un patio de
clasificación del ferrocarril. 
por algoritmo shunting yard
lo puedes buscar la verdad que yo hice algo particularizado
que te lo voy a poner
saludos de Lester:

#include<iostream>

#include <stack>

#include <queue>

#include <conio>

 
using namespace std;

int main(void){

 cout<<"Algoritm shunting yard Particularized,Transform the
algebraic expression \ninto RPN form (Reverse Polish Notation). Two-argument operators:
+, -, *, /, ^ \n(priority from the lowest to the highest),and brackets ().\n";

 cout<<"Execute with _\nFinish with 0\n";

 char a;

 stack< char > StackOP;

 queue< char > StackSal;

 

comienza:  while(cin>>a){

      if(a=='0')goto end;

      if(a=='_')break;

      if(a=='+'||a=='-'||a=='\\'||a=='*'||a=='^'){

       while(1){

           
if(StackOP.empty()){StackOP.push(a);break;}

           
if((a=='*'||a=='\\')&&(StackOP.top()=='+'||StackOP.top()=='-')){

                
StackOP.push(a);

                
break;

             }

             else
if((a=='-'||a=='+')&&(StackOP.top()=='*'||StackOP.top()=='\\'||StackOP.top()=='^')){

                
StackSal.push(StackOP.top());

                
StackOP.pop();

             }

             else
if((a=='*'||a=='\\')&&(StackOP.top() == '^')){

             
StackSal.push(StackOP.top());

             
StackOP.pop();

             }

             else
if(a=='^'){

             
StackOP.push(a);

              break;

             }

             else
if(StackOP.top()=='('){

            
StackOP.push(a);

             break;

             }

             else
if((a=='+'||a=='-')&&(StackOP.top()=='+'||StackOP.top()=='-')||(a=='\\'||a=='*')&&(StackOP.top()=='*'||StackOP.top()=='\\')){

                
StackSal.push(StackOP.top());

                
StackOP.pop();

             }

       }

 
    }

    else if(a=='('){

    StackOP.push(a);

    }

    else if(a==')'){

      while(StackOP.top()!='('){

      StackSal.push(StackOP.top());

      StackOP.pop();

      }

     StackOP.pop();

    }

    else{StackSal.push(a);}

 
 }

 
while ( !StackOP.empty() ){

         // view (and display) top element

        StackSal.push(StackOP.top());

        StackOP.pop(); // remove top element

 } //

 
 while ( !StackSal.empty() ){

        cout << StackSal.front(); // view
(and display) top element

        StackSal.pop(); // remove top element

 } // end   */

 cout<<endl;

 goto comienza;

 
end:system("pause");

 return 0;

 
}
esto te puede ayudar porque transforma expresiones con
parentesis y acepta operadores como suma resta cociente multiplicacion, parentesis etx
despues lo revisas.



---
Convencion Internacional de Psicologia y Ciencias Sociales y Humanas
Cienfuegos, Cuba, del 19 al 22 de abril del 2011
http://promociondeeventos.sld.cu/hominis2011
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100514/2eb1927f/attachment.html>


Más información sobre la lista de distribución Cconclase