Privacidad: Recuerde que la información escrita en los foros de programación es 100% pública y que su ip será registrada asociada a su mensaje. Si encuentra un mensaje fuera de lugar, por favor, notifiquelo para su revisión y eliminación.
C++. Conversión de una expresión infija a una postfija
Enviado por Gerardo el día 4 de mayo de 2004
por favor ayudenme a programar esto.
Gracias. Mi mail es ger_calvo@hotmail.com
Re: Re: Re: Re: C++. Conversión de una expresión infija a una postfija
Enviado por noel solw el día 8 de mayo de 2004
Este es el programa de conversion de infix a posfix, y en nota separada el header file, stack.h
Probalo bien, para estar seguro de que no hay problemas en la conversion.
// program InToPost.cpp
// convertir una expresion infix en otras postfix
// borland c++ for windows - ver 4.5
// 8/5/2004
#include "stack.h"
#include <string.h>
enum Symbol {OPERAND,OPEN,CLOSE,SUM,MULT,POW};
Symbol GetCharType(char x)
{
Symbol ret;
switch(x)
{
case '+' :
case '-' : ret = SUM;
break;
case '*' :
case '/' : ret = MULT;
break;
case '^' : ret = POW;
break;
case '(' : ret = OPEN;
break;
case ')' : ret = CLOSE;
break;
default : ret = OPERAND;
}
return ret;
} // GET CHAR TYPE
void Process(char *source)
{
Stack<char> st;
int pt = 0,len = strlen(source);
cout << " infix expression : " << source << endl;
char *target = new char[len+1];
for(int i = 0;i < len;i++)
target[i] = '.';
for(int ps = 0;source[ps];ps++)
{
char input = source[ps];
Symbol actual = GetCharType(input);
switch(actual)
{
case OPERAND : target[pt++] = input;
break;
case SUM :
case MULT :
case POW : while(!st.EmptyStack() && GetCharType(st.StackTop()) >= actual)
target[pt++] = st.Pop();
st.Push(input);
break;
case OPEN : st.Push(input);
break;
case CLOSE : char x = st.Pop();
while(GetCharType(x) != OPEN)
{
target[pt++] = x;
x = st.Pop();
}
} // SWITCH
} // FOR
while(!st.EmptyStack())
target[pt++] = st.Pop();
target[pt] = 0;
cout << "posfix expression : " << target << endl << endl;
delete []target;
} // PROCESS
void main()
{
clrscr();
char *a[6] = {"A+B",
"A+B-C",
"(A+B)*(C-D)",
"A^B*C-D+E/F/(G+H)",
"(A+B)*C-(D-E)^(F+G)",
"A-B/(C*D^E)"};
for(int i = 0;i < 6;i++)
Process(a[i]);
cout << "end of program - good bye ! ! ! " << endl;
getch();
} // MAIN
Re: Re: Re: Re: Re: C++. Conversión de una expresión infija a una postfija
Enviado por noel solw el día 8 de mayo de 2004
// program Stack.h - page 393 . . . . .
// Header File for Stack class.
// c++ exercices book - dr. gershon kagan - first edition : 2001
// written in Borland CPP ver 3.1
#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
// -------------------------------------------------------------------------
template <class T>
struct Node
{
T info;
Node<T> *next;
}; // STRUCT NODE
// -------------------------------------------------------------------------
template <class T>
class Stack
{
private:
Node<T> *top;
unsigned int len;
public:
Stack(int num = 0,T *data = NULL);
Stack(Stack<T> &right);
~Stack();
void Push(T);
T Pop();
int EmptyStack();
T StackTop();
unsigned int StackLen();
Node<T> *GetTopPointer() {return top;}
void operator=(Stack<T> &);
friend ostream &operator<<(ostream &,const Stack &);
}; // CLASS STACK
// -------------------------------------------------------------------------
template <class T>
Stack<T>::Stack(int num = 0,T *data = NULL)
{
top = NULL;
len = 0;
for(int i = num-1;i >= 0;i--)
Push(data[i]);
} // STACK CONSTRUCTOR
template <class T>
Stack<T>::Stack(Stack<T> &right)
{
top = NULL;
len = 0;
Transfer(*this,right.GetTopPointer());
} // COPY CONSTRUCTOR