lo que pides como tal, no se puede. Sin embargo, podemos crear una funcion que:
- Crea una pila auxiliar
- Vacie todos los datos de la pila primaria a la auxiliar
- Obtenga la posicion de elemento deseado
- Pasar todos los datos, salvo el elemento a eliminar.
- Completo.
Primer paso, creamos un metodo en el cual obtendremos la posicion del elemento a eliminar:
int Pila::posicion(int x){}
Luego creamos una Pila auxiliar con la que nos apoyaremos, ademas de otras variables, como un contador y una bandera (uno para ir verificando cuantos datos hemos recorrido y, el otro para decir si, es la que deseamos eliminar o no.:
Pila paux;
int band = 0:
int contador = 0;
Muy bien ahora viene la parte donde comprobamos si la pila no esta vacia, ya que, si esta vacia, que nos arroje un mensaje, seguido de un finalizar el metodo, esto lo logramos con un return -1
, entonces, esta parte quedaria algo asi:
if(estaVacia()){
cout<<"Error en posicion()\n";
return -1;
}
Si este no es el caso, nos dirigimos al else
donde viene la parte divertida y es que debemos pensar que sigue:
- Recorrer la pila mientras esta no este vacia.
- Contar y llevar nuestro control con la variable
contador
- Esperar a que nuestra bandera cambie de valor, si encontramos el dato que deseamos
Comencemos, lo primero que necesitamos es, recorrer la pila mientras esta aun tenga elementos y, durante el recorrido, ir checando el estado de nuestra bandera
(para detectar si esta cambia de valor). En codigo se traduce:
while(!estaVacia() && !band)
y dentro de este ciclo while, preguntamos si el dato que tenemos, es igual al que buscamos, la bandera cambia de 0 a 1.
if(getDato()==x)
band =1;
en caso de que esto no suceda, todos los elementos de tu pila original, se muevan a la pila auxiliar, excepto el dato que deseas sacar.
else
contador++;
paux.push(getDato());
pop();
Espera, que aun no hemos acabado, ya encontramos el dato que buscabamos, tambien lo eliminamos, y usamos la pila auxiliar. Pero, no hemos devuelto los elementos a la pila original, ya que, si no las traemos de vuelta, estas pueden perderse.
Iteramos en la pila auxiliar mientras esta no este vacia, para obtener los datos, sacarlos de esta pila y agregarlos de nueva cuenta a la pila original.
while(!paux.estaVacia())
push(paux.getDato());
paux.pop();
Y de esa manera es como puedes sacar un dato "de cualquier lugar"
El codigo completo quedaria algo asi:
int Pila::posicion(int x){
Pila paux;
int contador=0;
int band = 0;
if(estaVacia()){
cout<<"Error en posicion()\n";
return -1;
}else{
while(!estaVacia() && !band){
if(getDato()==x)
band =1;
else
contador++;
paux.push(getDato());
pop();
}while(!paux.estaVacia()){
push(paux.getDato());
paux.pop();
}
if(band)
return contador;
else
return -1;
}
}
Tambien te agrego el metodo getDato()
int Pila::getDato(){
if(estaVacia()){
cout<<"Error en getDato()";
return -1;
}
return tope->getDato();
}
Aclaracion, el codigo que explico es de un ejercicio que resolvi en la universidad, el cual difiere un poco de sintaxis con el tuyo. Aunque la logica es la misma. Si tienes alguna duda aqui estamos :)