Stack Overflow en español Asked by Tutos tiles para gente til 201 on August 26, 2021
Desarrollé un pequeño programa de pilas con arreglos. Ya tengo los métodos de insertar, eliminar y determinar si la pila esta vacía o llena, sin embargo, solo me falta el de mostrar los datos dentro del mismo ciclo en el que se desarrolla sin que en una segunda consulta me devuelva 0 o que la pila esta vacía.
Anexo el código completo, corre bien y cumple las funciones principales, pero encuentro la lógica para poder mostrar la pila cuando el usuario digite esa opción.
Agradeceré un apoyo para poder mostrar los datos que ha rellenado.
#include<stdio.h>
#include<stdlib.h>
#define tam 5
typedef struct{
int datos[tam];
int cima, pila;
}Pila;
int menu();
int llena(Pila pila);
int vacia(Pila pila);
int insertar(Pila *pila, int dato){
if(llena(*pila)==0){
pila -> cima++;
pila -> datos[pila->cima] = dato;
return 1;
}
return 0;
}
int eliminar(Pila *pila){
int aux;
if(vacia(*pila)==0){
aux = pila -> datos[pila->cima];
pila->datos[pila->cima]=0;
pila->cima--;
return aux;
}
return 0;
}
int cima(Pila pila){
if(vacia(pila)==0)
return pila.datos[pila.cima];
return 0;
}
int vacia(Pila pila){
if(pila.cima<0)
return 1;
return 0;
}
int llena (Pila pila){
if(pila.cima == tam-1)
return 1;
return 0;
}
int main(){
int opc, num, i, j;
Pila pila;
pila.cima=-1;
//while()
while((opc=menu())!=5){
switch(opc){
//Insertar datos a la pila
case 1:
printf(" Numero: ");
scanf("%d", &num);
if(insertar(&pila, num)==1)
printf("tInsertado a la pila correctamente");
else
printf(" La pila esta llena n");
break;
//Eliminar datos de la pila
case 2:
num=eliminar(&pila);
if(num!=0){
printf(" El elemento %d ", num);
printf("Ha sido eliminado correctamente ");
}
else
printf(" La pila esta vacia n");
break;
//Vaciar la pila
case 3:
j = pila.cima;
for(i=0; i<j; i++){
num = eliminar(&pila);
if(num!=0)
printf(" La pila ha quedado en blanco %d ", num);
}
break;
//Muestra el numero que se encuentra en la cima
case 4:
if(vacia(pila)==0)
printf(" La cima es %d ", pila.datos[pila.cima]);
else
printf(" La pila esta vacia ");
break;
default:
printf("Opcion invalida");
}
}
return 0;
}
//Menu principal
int menu(){
int opc;
printf("n----------------------------------n");
printf("tAlumno: n");
printf("tn");
printf("tGrupo: n");
printf("tProfesor: n");
printf("n");
introducir el código aquí
printf(" 1.-Insertarn");
printf(" 2.-Eliminarn");
printf(" 3.-Vaciarn");
///Mostrar pila aqui iria para mostrar la pila
printf(" 4.-Ciman");
printf(" 5.-Salirn");
scanf("%d", &opc);
system("cls");
return (opc);
}
Sí los datos de la pila están almacenado de esta manera:
Posición: 0 1 2 3
Dato: 3 1 5 9
Esto quiere decir que el miembro cima
tendría guardado la posición 3
(ya que el dato 9
es el tope de la pila).
Así que para recorrer cada posición de la pila simplemente debes hacerlo con un bucle inverso. Por lo tanto, la variable i
empezaría a partir de la posición 3
(en este caso) y terminaría cuando i
tome el valor de -1
.
De este modo el resultado en pantalla sería:
9 5 1 3
En código sería así:
//La función retorna 0 si la pila está vacía.
int mostrar(Pila* pila)
{
if(vacia(*pila) == 0)
{
for(int i = pila->cima; i != -1; --i)
printf("%dn", pila->datos[i]);
return 1;
}
return 0;
}
Modo de uso:
case 4:
if(!mostrar(&pila))
printf("Pila vacia!!n");
break;
No tiene sentido poner dos return
seguidos:
int llena (Pila pila)
{
if(pila.cima == tam-1)
return 1;
return 0;
}
Porque cuando la función retorne 1
terminará su ejecución, así que las sentencias que estén debajo no se ejecutarán.
Corecciones:
1.- Función llena
:
int llena (Pila pila)
{
return pila.cima == tam-1;
}
Sí la condición se cumple, la función retorna 1
.
2.- Función vacia
:
int vacia(Pila pila)
{
return pila.cima < 0;
}
3.- La función cima
tiene un inconveniente, ya que retorna el valor que está en el tope de la pila, pero puede ser un valor positivo o negativo, así que no hay forma de saber si la pila está vacía. Así que no queda de otra que omitir esa condición:
int cima(Pila pila)
{
return pila.datos[pila.cima];
}
Correct answer by MrDave1999 on August 26, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP