Problemas con eliminar en pilas

Iniciado por suncry, 22 Junio 2017, 09:46 AM

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

suncry

Chicos soy nuevo en el grupo y no se si pueda poner este problema en esta sección pero necesito ayuda X_x, alguien podria decirme como eliminar un elemento de pila segun su posicion?, es decir en un lado aparece la posicion 1-2-3-4-5 y en el otro los numeros que estan alli, de momento ni tengo ni idea de como comenzar esa funcion y de momento solo tengo esto T_T

#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;
struct Nodo {
   int Numero;
   Nodo *sgt;
};

int acu = 0;
int i ;

void INP(Nodo *&, int  );   //INP = Insertar numeros a la pila
void VNP(Nodo *);         //VNP = Ver numeros de la pila
void BNP(Nodo *&, int &);   //BNP = Borrar numeros de la pila 

int main (){
   Nodo *pila = NULL;
   int  Num , op ,Numero;
   int i = 0;
   while (op != 4){
      system("cls");
      cout << "1 - Ingrese datos a la pila" << endl;
      cout << "2 - Ver el listado de los datos en la pila " << endl;
      cout << "3 - Eliminar un numero en la pila (Seleccione la posicion a eliminar) " << endl;
      cout << "4 - Salir del programa" << endl;
      cin >> op;
      switch (op){
         case 1 :
            system("cls");
            cout << "ingrese un numero a la pila "  << endl;
            cin  >> Num;
            INP(pila,Num);
            acu = acu+1;
         break;
      
         case 2:
            system("cls");
            VNP(pila);
            getch();
         
         break;
   
         case 3:
            system("cls");
            cout << "Ingrese la posicion a eliminar" << endl;
            cin >> Num;
            BNP(pila,Num);
            getch();
          break;
       
          case 4:
          break;
      
         default:
         break;
      }
   }
}

void INP(Nodo *&pila, int dato ){ 
   Nodo *NN = new Nodo();   // la doble N significa nuevo nodo
   NN->Numero = dato;
   NN->sgt = pila;
   pila = NN;
   cout <<"\nEl numero " << dato << " ha sido registrado en la pila " << endl;
   getch();
}

void VNP(Nodo *pila){
   int aux,i = 0;
   cout << "Posicion  " << "       Numero registrado" << endl;
   while (pila != NULL){
      cout << "     "  << i+0;
      cout << "                    "<< pila->Numero << endl;
      pila = pila   ->sgt;
      i++;
   }
}

Serapis

#1
Cuando usas una pila programada por otro, sólo tienes disponible (habitualmente) los métodos Push y Pop... Entonces el unico modo de eliminar un elemento es llegar hasta él.

Operando con los datos que dices tener:
a.Push(1)
a.Push(2)
a.Push(3)
a.Push(4)
a.Push(5)

Ahora necesitas eliminar el elemento 3, que además tiene ese mismo valor (sin consideraciones de elemento 0, por simpliificar)...

1º - Se pasan a otra pila los que estén encima:
b.push (a.pop) //5
b.Push(a-Pop) //4


2º - Se extrae el elemento que queríamos (hemos excavado hasta llegar a él, ahora está en la superficie, el pico ahora golpea en él)
a.Pop //3

3º Meter de nuevo los que estaban encima:
a.Push(b.Pop)  //4
a.Push(b.pop) //5


Ahora bien, cuando la pila la diseña uno mismo, ya provee un método interno para agilizar esto... La solución depende en realidad de la estructura usada para realizar la pila...
Supongamos que fuera un array que es algo simple.

(privada) Funcion Delete(entero index)
   Recorrer desde index hasta ItemsEnPila-1
       Array(index) = Array(index +1)
   Siguiente
   ItemsEnPila -=1
    // Ojo, no se verifica en este ejemplo si index está en el rango... queda a tu esfuerzo.
Fin Funcion

Como ves todo lo que hemos hecho es bajar una posición todos los que tiene encima. ni siquera necesitamos borrar el último elemento, toda vez que Pop, sacará el último disponible y un Push sobrescribiría ese último valor.

Fijate que en una pila incluso eliminar x elemento del final o vacíar la pila, se limita a ajusta el valor de la propiedad ItemsEnPila, para vaciarla se pone a 0 y listo...

suncry

la verdad andaba perdido muy bien en como hacerlo, pero gracias a esa logica que aplicaste logre aplicarsela a mi ejercicio y resulto bien haha, gracias tio!!