Tal vez sea un poco simple la pregunta pero lo que es programación me ha costado un poco y sobre todo porque tiene mucho que la ejerzo.
Bueno una de mis preguntas es:¿ para pasarla de notación infija a posfija tendría que crear tres pilas?, una donde guarde los operandos, los operadores y las funciones trigonométricas?.
El código lo dejo aquí, y una parte donde no entiendo bien que hace si me pudiesen explicar y si me pudiesen dar ideas para realizar el programa.
Gracias
Código PHP:
#include<iostream>
#include<stdlib.h>
#include<ncurses.h>
#include<math.h>
#include<iostream>
#include<fstream>
using namespace std;
class Pila{
private:
struct Elemento{
int dato;
Elemento *ant;
}*p;
public:
Pila(){
p=NULL;
}
void insertar(int d){
Elemento *q;
q=new Elemento();
q->dato=d;
q->ant=p;
p=q;
}
int extraer(){
Elemento *q;
int d;
if(p==NULL){
cout<<"\nPila vacia";
return -1;
}
q=p;
p=q->ant;
d=q->dato;
delete q;
return d;
}
bool vacia(){// si esta vacia
if(p==NULL)
return true;
return false;
}
~Pila(){
while(p!=NULL)
extraer();
}
};
bool pre(char a, char b){//toma simbolos
/*
Aquí pensaba agregar las funciones trigonométricas pero como es de carácter por carácter entonces por ejemplo sen me marca un error
*/
int p1, p2;
if(a=='+' || a== '-')
p1=1;
else if(a=='*' || a=='/' || a=='%')
p1=2;
else if(a=='(')
p1=0;
else if(a==')')
p1=0;
if(b=='+' || b== '-')
p2=1;
else if(b=='*' || b=='/' || b=='%')
p2=2;
else if(b=='(')
p2=0;
else if(b==')')
p2=0;
if(p2>p1)
return true;
return false;
}
char *posfija(char *infija){
Pila p;
char *pos;
char a,b;
int i,j, len=-1;
while(infija[++len]!=0);
pos=new char[len+1];
j=0;
for(i=0; i<len; i++){
if((infija[i]>='0' && infija[i]<='q') || (infija[i]>='a' && infija[i]<='z')){
pos[j++]=infija[i];
}
else{//de aquí para adelante hasta terminar la función no entiendo muy bien que hace//
if(p.vacia()){
p.insertar(infija[i]);
}
else{
a=p.extraer();
b=infija[i];
if(b==')'){
while(a!='('){
pos[j++]=a;
/* if(p.vacia())
a='(';
else*/
a=p.extraer();
}
}
else{
if(pre(a,b) || infija[i]=='('){
p.insertar(a);
p.insertar(b);
}
else{
pos[j++]=a;
p.insertar(b);
}
}
}
}
}
while(!p.vacia()){
a=p.extraer();
pos[j++]=a;
}
pos[j]=0;
return pos;
}
int main(){
Pila p;//objeto p de la clase pila
int i;
char a[]="a-((a+b)*c)/d";
char *b;
b=posfija(a);
cout<<b;
// for(i=0; i<100; i++)
// p.insertar(i);
//while(!p.vacia())
//printf("%d\t", p.extraer());
getchar();
return 0;
}