Pila en C++

Iniciado por Norochii, 25 Mayo 2011, 19:01 PM

0 Miembros y 1 Visitante están viendo este tema.

Norochii

Código (cpp) [Seleccionar]

//Pila.cpp
//By Norochii
//Estructura de Datos
#include "StdAfx.h"
#include "Pila.h"
#include <iostream>
using namespace std;

Pila::Pila(void) //Constructor. se inicializa el tope o cima de la pila en -1
{
top = -1;
}


Pila::~Pila(void) //Destructor. Destruye los datos de la pila
{
cout<<"Destruyendo datos"<<endl;
}

void Pila::EmptyStack() //Verifica si la pila esta vacia,
{ //viendo si el tope esta en -1
top = -1;
}

void Pila::AddStack(int elemento) //Verifica si la Pila esta llena
{
if(FullStack()) //Si la pila esta llena emite el mensaje
{ //Desbordamiento pila
cout<<"Desbordamiento pila :";
}
else //Sino el apuntador o subindice se incrementa con cima++
{

top++; //y se almacena un elemento en el arreglo A[cima] automaticamente
A[top] = elemento; //ya que se iguala. El elemento que entro se guarda en el arreglo A[]

}
}


void Pila::Push(int elemento) //Esta funcion coincide con la funcion AddStack()
{
AddStack(elemento);
}


int Pila::Pop() //Esta funcion extrae los elementos de la pila
{
int Aux; //Se crea una variable auxiliar o temporal para poder guardar
if(top == -1) //dentro de la variable Aux el ultimo elemento en entrar
{
cout<<"Se intenta sacar un elemento de una Pila vacia"<<endl;
}
else
{
Aux = A[top]; //Aqui se guarda el elemento del tope osea el ultimo elemento en entrar
top--; //se decrementa el tope y apunta al siguiente elemento y asi sucecivamente hasta que quede en -1
}
return Aux; //se retorna el ultimo elemento del arreglo A[] almacenado en la variable Aux
}

int Pila::FirstStack() //comprueba que la pila no este vacia
{
if(top == -1) //Si esta vacia emite un mensaje
{
cout<<"Se intenta sacar un elemento de una Pila vacia"<<endl;
}
else //sino se dara el elemento del arreglo A[] almacenado en la posicion apuntada por la cima
{
return A[top];
}
}


void Pila::ClearStack() //Se encarga de eliminar el ultimo elemento que entro en la pila
{
if(top == -1) //Primero comprueba que la pila no este vacia
{ //Si esta vacia emite un mensaje
cout<<"Se intenta sacar un elemento de una Pila vacia"<<endl;
}
else //Sino se decrementa el tope en 1
{
top--;
}
}

bool Pila::FullStack()
{
return top == MaxTamPila-1; //En este caso la pila estara llena cuando el tope apunte al valor MaxTamPila-1
}

void Pila::CuentaPila() //Esta funcion es para saber cuantos elementos hay en la pila
{
if(top == -1)
{
cout<<"Se han sacado los elementos anteriormente o aun no introduce ninguno"<<endl;
}
else
cout<<"Elementos existentes en la pila : "<<top + 1<<" Elementos"<<endl;
}

void Pila::Elementos() //Una funcion que lo unico que hace es mostrar un mensaje de cuantos elementos se han introducido hasta ese momento
{

cout<<"Elemento "<<top +2 <<endl;
}
Norochii

Acermax

No sé exactamente que problemas tienes, pero mirándolo así por encima te puedo decir alguna cosa a corregir.

Código (cpp) [Seleccionar]

void Pila::EmptyStack() //Verifica si la pila esta vacia,
{ //viendo si el tope esta en -1
top = -1;
}


Esto no hace lo que dice el comentario, lo que hace esta función es limpiar la pila.
Para hacer lo que dice el comentario deberías retornar un booleano y comprobar si el tope es igual a -1

Código (cpp) [Seleccionar]

int Pila::Pop() //Esta funcion extrae los elementos de la pila
{
int Aux; //Se crea una variable auxiliar o temporal para poder guardar
if(top == -1) //dentro de la variable Aux el ultimo elemento en entrar
{
cout<<"Se intenta sacar un elemento de una Pila vacia"<<endl;
}
else
{
Aux = A[top]; //Aqui se guarda el elemento del tope osea el ultimo elemento en entrar
top--; //se decrementa el tope y apunta al siguiente elemento y asi sucecivamente hasta que quede en -1
}
return Aux; //se retorna el ultimo elemento del arreglo A[] almacenado en la variable Aux
}



Ten cuidado aquí. En el caso de que la pila esté vacía, estás retornando una variable sin ningún valor de inicialización, así que no puedes saber lo que estas devolviendo. El return debería ir dentro del else.

Además, en cuestión a todos estos mensajes. En el caso de que se esté intentando extraer un elemento de una pila vacía, o no se puede introducir un elemento porque la pila está llena, deberías envíar un error con un aserto o con  un throw y parar la ejecución del programa. Un simple mensaje por pantalla no estaría bien.

Supongo que los nombres de las funciones te los mandarían poner en clase así, pero lo normal es que la función Pop() haga lo que hace tu función ClearStack(),y haya una  función Top() que haga lo que hace tu función Pop().

Si veo algo más ya vuelvo a postear.