[C con Clase] Obtener color de pixel
Steven Richard Davidson
stevenrichard.davidson en gmail.com
Jue Ene 10 12:12:19 CET 2008
Hola Manuel,
On Jan 10, 2008 5:14 AM, manuel escobedo escareño
<beat_galactic en hotmail.com> wrote:
> tengo dudas con una clase para convertir expresiones infijas en postfijas
> segui paso a paso un algoritmo y falla en el parentesis derecho
>
Veamos el código fuente.
> enum simbolo {operando, pIzq, pDer,
> SumResta, MultDiv, Pow};
> class polaca
> {
> private:
> String lexema;
> simbolo precedencia (char c)
> {
> simbolo aux;
> switch (c)
> {
> case '+':
> case '-': aux = SumResta; break;
> case '*':
> case '/': aux =MultDiv; break;
> case '^': aux = Pow; break;
> case '(': aux = pIzq; break;
> case ')': aux = pDer; break;
> default : aux = operando; break;
> }
> return aux;
No hacía falta usar una variable auxiliar. Podrías haber escrito algo
parecido a lo siguiente:
switch( c )
{
case '+': case '-': return SumResta;
case '*': case '/': return MultDiv;
...
}
return operando; // Por defecto, se trata de un operando
> }
> stack <char> s;
> public:
> polaca (String s)
> {
> lexema = s;
> }
Aconsejaría usar la lista inicializadora del constructor. Esto es,
polaca( String s ) : lexema( s ) {}
> String convertir ()
> {
> String salida = "";
> for (int i = 1; i <= lexema.Length(); i++)
En estos momentos no tengo Builder instalado ni recuerdo todos los
detalles de su clase 'String'. Sin embargo, no estoy seguro de si
aceptaba índices a partir de 1, y no a partir de 0. Sugiero que lo
revises, por si estoy en lo cierto.
> {
> char c = lexema[i];
> simbolo simb = precedencia(c);
> switch (simb)
> {
> case operando: salida = salida + c; break;
> case pIzq: s.push(c); break;
> case pDer: {
> while(!s.isempty() && s.top() != '(')
> salida = salida + s.pop();
> s.pop();
> }
Aquí tienes algunos problemas. La función miembro 'pop()' no retorna
ningún valor. Si quieres el valor, usar 'top()'. Tu código sería algo
como,
while( !s.isempty() && s.top() != '(' )
{
salida = salida + s.top();
s.pop();
}
s.pop();
> break;
> case SumResta:
> case MultDiv:
> case Pow: {
> while (s.isempty() == false && precedencia(s.top()) >= c)
No se suele comparar explícitamente valores booleanos. Aconsejo, para
este caso, usar el operador !. Esto es,
while( !s.isempty() && ... )
> {
> salida = salida + s.pop();
Aquí tienes el mismo problema. La función 'pop()' no retorna ningún
valor; usa 'top()'. Esto sería,
salida = salida + s.top();
s.pop();
> }
> s.push(c);
> }
> break;
> }
> }
> while(s.isempty() == false)
> salida = salida + s.pop();
Nuevamente, tenemos el mismo error.
> return salida;
> }
> };
>
> podrian orientarme al menos? gracias...
> la clase stack es un pila de listas enlazadas y el programa esta hecho en c++ builder 6
La clase-plantilla 'stack' no es una pila de listas enlazadas, sino un
pila que internamente y por defecto usa una cola especial: 'deque<>'.
Espero que todo esto te sirva.
Steven
Más información sobre la lista de distribución Cconclase