Te lo explico medio a lo bruto (lo que recuerdo) porque justo la carpeta de Matemática Discreta (donde nos explicaron esto) la presté.
Directo: p -> q. Tomás la hipótesis p, y en base a igualdades, teoremas demostrados, leyes,etc, llegas a q.
Contrarecíproco: (Si p->q es verdadera, entonces: ¬q -> ¬p también es verdadera). Partís de una tésis falsa, y llegás a una hipótesis falsa. Demostrando la seguna implicación (contrarecíproca) queda demostrada que la primer implicación también es verdadera.
Reducción al absurdo: Partís de ¬p y en base a igualdades llegás a algún absurdo (Ejemplo: llegar a 1 = 0). Por ende, si ¬p es falsa --> p es verdadera.
No hay más que lo que dijo CeroX901. Existen varias formas de hacerlo y podrías dar más información sobre que tipo de lista estás trabajando. Una lista simple, una lista simple ordenada, lista doble, circular, etc. Principalmente, lo mejor sería que esté ordenada, el algoritmo es más sencillo porque solo necesitarías 1 recorrido a la lista. Pero con tan poca información y sin nada de código de tu parte, resulta complicado ayudar Saludos
Por supuesto que no te deja visualizarlo, esa no es la funcionalidad de una pila. No estás usando la estructura correcta (o al menos la más eficiente) para hacerlo. Para ingresar y extraer exactamente en el orden en que ingresaste el dato, es mejor usar una Cola (First in, First out). La pila (First in, Last out) va extrayendo en base al último dato que ingresaste en ella, es decir, el tope.
Sobre el tipo de dato nodo, depende de los campos o datos que tenga que almacenar dicho nodo. Además, también depende de la estructura de datos que vayas a usar! Para todo lo demás, existen punteros