como elimino el ultimo nodo de que ingrese( pila c++ )

Iniciado por jorgecotrinax, 30 Septiembre 2019, 02:12 AM

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

jorgecotrinax

como elimino los últimos datos que ingrese, he visto muchos foros pero solo me los elimina del primero al ultimo  y yo quiero del ultimo al primero


#include<iostream>
using namespace std;
template<class T>
class Nodo {
public:
T dato;
Nodo<T>* siguiente;
Nodo(T x) {
dato = x;
siguiente = NULL;
}
};
template<class T>
class Pila {
public:
Nodo<T>* cabeza;
Nodo<T>* cola;
Pila() {
cabeza = NULL;
cola = NULL;
}
void insertarfinal(T x) {
Nodo<T>* nuevo = new Nodo<T>(x);
if (!cabeza) {
cabeza = nuevo;
}else {
Nodo<T>* aux = cabeza;
while (aux->siguiente)
{
aux = aux->siguiente;
}
aux->siguiente=nuevo
}
cola = nuevo;
}

void eliminarultimo() {
//como hago esto :c ....!!!!
}
void imprimir() {
Nodo<T>* aux = cabeza;
while (aux) {
cout << aux->dato << "-";
aux = aux->siguiente;
}
cout << endl;
}
};
int main() {
Pila<int> milista;
milista.insertarfinal(1);
milista.insertarfinal(2);
milista.insertarfinal(3);
milista.insertarfinal(4);
milista.insertarfinal(6);
milista.imprimir();
milista.eliminarultimo();
cout << endl;
milista.imprimir();
milista.eliminarultimo();
cout << endl;
milista.imprimir();
milista.eliminarultimo();
cout << endl;
milista.imprimir();
milista.eliminarultimo();
cout << endl;
system("pause");
}


K-YreX

No tiene mucho sentido ya que la gracia de usar una Pila es insertar al principio en O(1) y eliminar del principio en O(1). Si insertas y eliminas por el final, las operaciones pasarán de ser O(1) a O(n)... pero si es lo que quieres, me limito a darte una opción.
Creas un nodo auxiliar que empezando en <cabeza> vaya avanzando hasta que <aux->siguiente> sea igual a <cola>. Entonces eliminas <cola> e igualas <cola> a <aux>. Cuidado con lo de "hasta que <aux->siguiente> sea igual a <cola>" ya que puedes tener dos elementos iguales pero que no sean el mismo. Tendrás que comprobarlo con sus direcciones de memoria.
Otra forma que se parecería un poco más a la estructura de una pila (aunque poco) es tener una función que devuelva el número de elementos de la pila. El típico <size()> del contenedor <stack> de la STL. Entonces lo mismo, avanzas con un puntero auxiliar hasta uno menos del último y haces lo mismo de antes.

PD: Tal y como quieres usarlo sería mejor usar listas doblemente enlazadas, en las que cada nodo tiene un puntero a siguiente y otro a anterior. La gracia de estas es trabajar con inserciones y borrados en ambos extremos en O(1). Así sólo tendrías que empezar en <cola>, crear un puntero auxiliar que apunte también a <cola>, hacer que <cola> apunte al anterior y borrar el auxiliar.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;