desarrollo de pila, error en función apilar

Iniciado por JZtban, 28 Abril 2013, 01:34 AM

0 Miembros y 3 Visitantes están viendo este tema.

JZtban

#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define tamax 10

using namespace::std;

struct pila
{
       int info[10];
       int tope;
       int valor;
};

void crear_pila(pila &p);
void pila_vacia(pila &p);
void apilar(pila &p, int valor);
void desapilar(pila &p);
void mostar_pila(pila &p);
int sw =0;

void menu()
{
    system("cls");
    cout<<"\n\t1_Crear Pila           ";
    cout<<"\n\t2_Apilar               ";
    cout<<"\n\t3_Desapilar            ";
    cout<<"\n\t4_Mostrar Pila         ";
    cout<<"\n\t5_Salir               \n";
    cout<<"\n\tElija Opcion a realizar:  ";
}

int main()
{   
      int opc, valor;
       struct pila p;

       do
       {
         menu(); 
         cin>> opc;
          switch(opc)
          {                   
             case 1:crear_pila(p);break;
             
             case 2:
                  system("cls");
                  if(sw == 0)
                  {
                  system("cls");           
                  cout<<"\n\n\n\n\t\t\tDebe Crear Pila\n";
                  system("PAUSE");break;
                  }
                  cout<<"\n\n\n\n\t\tIngrese un numero Entero: ";
                  cin>>valor;
                  apilar(p,valor);break;
                 
             case 3: 
                  if(sw == 0)
                  {
                       system("cls");           
                       cout<<"\n\n\n\n\t\tLa Pila Esta Vacia no puede desapilar\n";
                       system("PAUSE");
                  }
                  desapilar(p);break;
                 
             case 4:
                    if(sw == 0)
                  {
                  system("cls");           
                  cout<<"\n\n\n\n\t\tLa Pila esta vacia no se puede mostrar\n";
                  system("PAUSE");
                  }
                  mostar_pila(p);break;
          }     
      }while(opc!=5);
      return 0;
}

void crear_pila(pila &p)
{
      system("cls");
      for(int x=0;x<10;x++)
      {
       p.info
  • =0;
          }
         
          sw= 1;
          cout<<"\n\n\n\n\t\tLa Pila Se ha sido Creada\n";
          system("pause");       
    }

    void pila_vacia(pila &p)
    {
          p.tope=0;
    }

    void apilar(pila &p, int valor)
    {
                if(p.tope == tamax)
                {
                  system("cls");
                  cout<<"\n\n\n\n\t\tLa Pila Esta Llena\n";
                  system("PAUSE");
                }
                else
                {
                    system("cls");
                    p.tope++;
                    p.info[p.tope] = valor;               
                    cout<<"\n\n\n\n\t\tEl Elemento: "<<valor<<" ha sido Guardado\n" ;
                    system("PAUSE");                 
                }     
    }

    void desapilar(pila &p)
    {
         int dato;
         if(sw=0)
         {
              sw= 1;
              system("cls");
              p.tope--;
              cout<<"\n\n\n\n\tSe ha eleminado el dato "<<dato<<"\n";
              system("PAUSE");     
         }
    }

    void mostar_pila(pila &p)
    {
          system("cls");
          if(p.tope > 0)
          {     
                sw= 1;                 
          }
          else
          {
             for(int j =0;j<tamax;j++)
             {
                     cout<<"\n\t"<<p.info[j]<<"\n\t";
             
             }
              cout<<"\n\n\n\tElementos de la Pila\n";
              system("PAUSE");
             
          }     
    }

durasno

Y cual es el error?? no compila??? la funcion no hace lo que deberia?? etc

Tenes que aclarar lo mas posible para poder ayudarte, por ejemplo dando un ejemplo de lo que sucede


Saludos
Ahorrate una pregunta, lee el man

rir3760

Como ya te comentaron si tienes un problema explicalo a detalle y por favor utiliza las etiquetas de código ya que si no lo haces el foro interpreta de forma incorrecta algunas partes del código fuente (el caso mas conocido es el texto en cursiva).

En cuanto al programa:

* No necesitas de la variable global "sw" en su lugar el numero de elementos (el campo "tope") indica si la pila esta vacía.

* En la función "apilar" incrementas el contador y después agregas el valor:
Código (cpp) [Seleccionar]
p.tope++;
p.info[p.tope] = valor;

Esta mal ya que debe ser al revés.

* En la funcion "desapilar" utilizas el operador de asignación "=":
Código (cpp) [Seleccionar]
if (sw = 0){
Cuando deberías utilizar el operador de comparación "==".

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

JZtban

ok, disculpen por no especificarme de la mejor manera. ya realice las corección que me sugirieron, no desapila

rir3760

Si solo respondes "ya esta pero no funciona" es difícil ayudarte.

En su lugar publica el código fuente actualizado junto con una descripción de los problemas que todavía existen en el programa. Y cuando publiques código fuente utiliza las etiquetas de código.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

JZtban

ok, primero agradezco por estar pendiente ayudándome.
Bueno ahora el código esta actualizado y solo resta corregir en la función mostrar, ya que la pila tiene la característica de el primero en entrar es el ultimo en salir. pero no se como declarar la sentencia para que realice la operación mostrar teniendo en cuenta la característica de la pila.

Espero me puedan ayudar.
Muchas Gracias.


#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define tamax 10

using namespace::std;

struct pila
{
       int info[10];
       int tope;
       int valor;
};

void crear_pila(pila &p);
void pila_vacia(pila &p);
void apilar(pila &p, int valor);
void desapilar(pila &p);
void mostar_pila(pila &p);
int sw =0;

void menu()
{
    system("cls");
    cout<<"\n\t1_Crear Pila           ";
    cout<<"\n\t2_Apilar               ";
    cout<<"\n\t3_Desapilar            ";
    cout<<"\n\t4_Mostrar Pila         ";
    cout<<"\n\t5_Salir              \n";
    cout<<"\n\tElija Opcion a realizar:  ";
}

int main()
{   
      int opc, valor;
       struct pila p;

       do
       {
         menu(); 
         cin>> opc;
          switch(opc)
          {                   
             case 1:crear_pila(p);break;
             
             case 2:
                  system("cls");
                  if(sw == 0)
                  {
                  system("cls");           
                  cout<<"\n\n\n\n\t\t\tDebe Crear Pila\n";
                  system("PAUSE");break;
                  }
                  cout<<"\n\n\n\n\t\tIngrese un numero Entero: ";
                  cin>>valor;
                  apilar(p,valor);break;
                 
             case 3: 
                  if(sw == 0)
                  {
                       system("cls");           
                       cout<<"\n\n\n\n\t\tLa Pila Esta Vacia no puede desapilar\n";
                       system("PAUSE");
                  }
                  else
                  {
                  desapilar(p);break;
                  }
                 
             case 4:
                    if(sw == 0)
                    {
                      system("cls");           
                      cout<<"\n\n\n\n\t\tLa Pila esta vacia no se puede mostrar\n";
                      system("PAUSE");
                    }
                    else
                    {
                      mostar_pila(p);break;
                    }
          }     
      }while(opc!=5);
      return 0;
}

void crear_pila(pila &p)
{
      system("cls");
      for(int x=0;x<=tamax;x++)
      {
       p.info
  • =0;
           p.tope=0;
          }
         
          sw= 1;
          cout<<"\n\n\n\n\t\tLa Pila Se ha sido Creada\n";
          system("pause");       
    }

    void pila_vacia(pila &p)
    {
              p.tope=0;         
    }

    void apilar(pila &p, int valor)
    {
                if(p.tope == tamax)
                {
                  system("cls");
                  cout<<"\n\n\n\n\t\tLa Pila Esta Llena\n";
                  system("PAUSE");
                }
                else
                {
                    system("cls");
                    p.info[p.tope] = valor;               
                    p.tope++;
                    cout<<"\n\n\n\n\t\tEl Elemento: "<<valor<<" ha sido Guardado\n" ;
                    system("PAUSE");                 
                }     
    }

    void desapilar(pila &p)
    {
         int dato;
         if(p.tope>0)
         {
              sw= 1;
              system("cls");
              p.tope--;
              dato = p.info[p.tope];
              p.info[p.tope]=0;
              cout<<"\n\n\n\n\tSe ha eleminado el valor "<<dato<<"\n";
              system("PAUSE");     
         }
    }

    void mostar_pila(pila &p)
    {
          system("cls");
          if(p.tope > 0)
          {     
                sw= 1;                 
          }
          if(sw==1)
          {
             for(int j =0;j<tamax;j++)
             {
                     cout<<"\n\t"<<p.info[j]<<"\n\t";
             
             }
              cout<<"\n\n\n\tElementos de la Pila\n";
              system("PAUSE");
             
          }     
    }

rir3760

En esa función no tienes porque modificar la variable sw, como ya te comente su uso no es necesario. Para imprimir los valores como una pila (primero en entrar, ultimo en salir) solo tienes que procesar los elementos empezando por el ultimo:
Código (cpp) [Seleccionar]
void mostar_pila(pila &p)
{
   if (p.tope == 0)
      cout << "Pila vacia" << endl;
   else
      for (int j = p.tope; j > 0; j--)
         cout << p.info[j - 1] << endl;
}


Pero, honestamente, no es una buena idea. En su lugar debes seguir la convención y procesar sus elementos solo en base a las funciones push y pop (apilar y desapilar en tu caso).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

JZtban

Bueno, Amigo muchas Gracias por todo,, me sirvió de mucho tu ayuda.
Y disculpas por ser tan enredado y causar problemas jeje  :D

Gracias, Saludos.