C/Visual C - Pila implementada con apuntadores

 
Vista:

Pila implementada con apuntadores

Publicado por Delma (1 intervención) el 18/06/2006 18:18:52
Hola! Estoy resolviendo el siguiente ejercicio y me tope con un problema q no consigo resolver :(
Sera q alguien me puede ayudar?
Gracias desde ya :)
Delmita

OBS: al algoritmo me funciona con cualquier operacion matematica, menos para las del tipo: A + B )
O sea, mi algoritmo no se percata q se cerro un parentisis q nunk se abrio :S
pero para los otros ejemplo del enunciado del ejercicio, si funciona :S
/*TEMA 1:

Considere una operacion matem tica que contenga varios conjuntos de
par‚ntesis, llaves y corchetes anidados, por ejemplo.

7 - [(x*{(x+y)/(j-e)})+y]/(4-2.5)

Quiere asegurarse de que los parentesis, llaves y corchetes est‚m anidados
en forma correcta; es decir quiere comprobarse:
I) Que hay el mismo numero de parentesis, llaves y corchetes izquierdos
y derechos
II) Que todo par‚ntesis, llaves y corchetes derecho este precedido por su
pareja izquierdo.
Expresiones del tipo...

({A+B)) o A+B(

Violan la condicion I y las de tipo

] A+B-C] o (A+B)-(C+D

Violan la condici¢n II

TDA a utilizar "PILA implementada con apuntadores"
La expresi¢n debe ser introducida por teclado.
Caracteres a considerar
-()
-[]
-{}
*/
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#define max 100
struct pila
{
char posicion[max];
int tope;
};
typedef struct pila t_pila;
t_pila p;
void cargar(char);
void sacar(void);

void main()
{
clrscr();
char vector[max],res;
int cont;
do{
p.tope=0;
clrscr();
textcolor(3);
cprintf("\nIngrese la expresion: ");
gets(vector);
cont=strlen(vector);
for(int i=0;i<cont;i++)
{
if(vector[i]=='('||vector[i]=='['||vector[i]=='{')
cargar(vector[i]);
else
{
if((vector[i]==')'&& p.posicion[p.tope]=='('))
sacar();
if((vector[i]==']'&& p.posicion[p.tope]=='['))
sacar();
if((vector[i]=='}'&& p.posicion[p.tope]=='{'))
sacar();
}
}

if(p.tope==0)
{
printf("\n\n");
printf("La ecuacion es CORRECTA!!!! =)");
}
else
{
printf("\n\n");
textcolor(4);
cprintf("La ecuacion NO ES CORRECTA... =,(");

}
getch();
clrscr();
textcolor(6);
cprintf("\n\n\nDesea seguir cargando S/N...?");
res=tolower(getch());
}while(res!='n');
}

void cargar(char simbolo)
{
p.tope++;
p.posicion[p.tope]=simbolo;
}

void sacar()
{
p.tope--;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Pila implementada con apuntadores

Publicado por Alberto Menendez Romero (16 intervenciones) el 18/06/2006 21:55:12
hola...

ok... empezare por decirte que el programa hasta cierto punto estaba correcto.. el problema radicaba en que cuando cuando estabas en la posicion 0 de la cadena y lo que habia alli era un simbolo abierto (que es incorrecto), tu programa no hacia nada.. es decir, no ejecutaba ninguna de las intrucciones de condicion.. sin embargo. el tope d e la pila seguia siendo cero. por lo que al final del programa, en el momento de dar una respuesta de correcto/incorrecto, como el tope era cero decia que la expresion era correcta, no siendo cierto lo anterior..

para solucionarlo podemos designar una variable que nos diga en todo momento si la expresin hasta el momento es correcta o incorrecta..., es decir, se encontramos un simbolo cerrado y anteriomente se habia puesto uno abierto, entonces extraemos de la pila, en caso contrario decimos que correcta es falso (0), (que era ahi donde estaba el problema del programa)..

y por un problema de obtimizacion, cambiamos el for por un while para si encontramos en algun punto de la expresion antes de llegar al final, que esta deja de ser correcta, parar y no seguir comprobando,,,

bueno saludos y suerte !!!!

// el codigo comieinza aqui

#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>

#define max 100

struct pila
{
char posicion[max];
int tope;
};

typedef struct pila t_pila;
t_pila p;

void cargar(char);
void sacar(void);

int main()
{
clrscr();
char vector[max],res;
int cont,i,correcta;

do
{
p.tope=0;
clrscr();
textcolor(3);
cprintf("\nIngrese la expresion: ");
gets(vector);
cont=strlen(vector);

correcta = 1;
i=0;
while ((correcta==1) && (i<cont))
{
if(vector[i]=='('||vector[i]=='['||vector[i]=='{') cargar(vector[i]);
else
{
if (vector[i]==')')
if (p.posicion[p.tope]=='(') sacar();
else correcta = 0;

else if (vector[i]==']')
if (p.posicion[p.tope]=='[') sacar();
else correcta = 0;

else if (vector[i]=='}')
if (p.posicion[p.tope]=='{') sacar();
else correcta = 0;
}
i++;
}

if ((correcta == 1) && (p.tope==0))
{
printf("\n\n");
printf("La ecuacion es CORRECTA!!!! =)");
}
else
{
printf("\n\n");
textcolor(4);
cprintf("La ecuacion NO ES CORRECTA... =,(");
}
getch();
clrscr();
textcolor(6);
cprintf("\n\n\nDesea seguir cargando S/N...?");
res=tolower(getch());
} while(res!='n');

return 0;
}

void cargar(char simbolo)
{
p.tope++;
p.posicion[p.tope]=simbolo;
}

void sacar()
{
p.tope--;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar