/*
Las pilas son similares a las colas pero se diferencian en que la pila saca al ultimo en ser metido.
Mientras que el primer item en ser metido será el ultimo en ser sacado.
*/
//package experimentos;//Si quieres activar esta linea debes meter el archivo en una carpeta llamada: experimentos.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
*
* @author Rafael Angel Montero Fernández.
*/
public class Pilas
{
public static void main(String args[])
{
Form_pila frm=new Form_pila();
frm.show();
}//main
}//class Pilas
class Nodo_pila
{
private String Nombre="", detalles="", fecha="";
private int valor=0;//Se incluye por si se quieré usar como clave.
private Nodo_pila primero=null;
public Nodo_pila(String nuevo_nombre, String nueva_fecha, int nuevo_valor, String nuevos_detalles)
{
setFecha(nueva_fecha);
setValor(nuevo_valor);
setDetalles(nuevos_detalles);
setNombre(nuevo_nombre);
}//Constructor sin parametros.
public void setFecha(String nueva_fecha)
{
this.fecha=nueva_fecha;
}//setFecha
public String getFecha()
{
return this.fecha;
}//getFecha
public void setValor(int nuevo_valor)
{
valor=nuevo_valor;
}//setValor
public int getValor()
{
return valor;
}//getValor
public void setDetalles(String nuevos_detalles)
{
this.detalles=nuevos_detalles;
}//setDetalles
public String getDetalles()
{
return this.detalles;
}//getDetalles
public void setNombre(String nuevo_nombre)
{
this.Nombre=nuevo_nombre;
}//setNombre
public String getNombre()
{
return this.Nombre;
}//getNombre
public Nodo_pila()
{
this.primero=null;
}//Constructor sin parametros.
public void setPrimero(Nodo_pila nuevo_nodo)
{
this.primero=nuevo_nodo;
}//setSiguiente
public Nodo_pila getPrimero()
{
return this.primero;
}//getSiguiente
}//class Nodo
class Pila
{
private Nodo_pila pila_de_nodos=null, primero=null, recorrido=null;
private boolean la_pila_esta_bacia()
{
return this.pila_de_nodos==null;//Retorna true si la cola es null.
}//la_pila_esta_bacia
//Elimina todos los items de la pila.
public void vaciar()
{
largo_de_la_cola=0;
pila_de_nodos=null;
}//vaciar
private int largo_de_la_cola=0;
public int getLargo_de_la_cola()
{
return largo_de_la_cola;//Pero se retorna aquí. Ya sabes polimorfismo.
}//getLargo_de_la_cola
//Saca el primer nodo de la pila sin mostrarlo.
public void sacar()
{
this.pila_de_nodos=this.pila_de_nodos.getPrimero();
}//sacar
//Saca al primer nodo de la pila pero lo muestra.
public Nodo_pila sacar_primero_y_verlo()
{
if(pila_de_nodos!=null)
{
largo_de_la_cola--;
this.primero=new Nodo_pila(this.pila_de_nodos.getNombre(), pila_de_nodos.getFecha(), pila_de_nodos.getValor(), pila_de_nodos.getDetalles() );
this.pila_de_nodos=this.pila_de_nodos.getPrimero();
return this.primero;
}//if
return null;
}//sacar_primero_y_verlo
public void apilar(Nodo_pila nuevo_nodo)
{
//No se esta usando nuevo_nombre
Nodo_pila nuevo_nodo_local=nuevo_nodo;//new Nodo(nuevo_nombre,numero, null);
if(pila_de_nodos==null)
{
largo_de_la_cola=1;
System.out.println("En la raiz " + nuevo_nodo_local.getNombre());
pila_de_nodos=new Nodo_pila( nuevo_nodo_local.getNombre(), nuevo_nodo_local.getFecha(), nuevo_nodo_local.getValor(), nuevo_nodo_local.getDetalles());
}//if
else
{
this.recorrido= pila_de_nodos;
while(this.recorrido!=null)
{
System.out.println("En la cola " );
largo_de_la_cola++;
if(recorrido.getPrimero()!=null)
{
System.out.println("Sigueinte " + recorrido.getPrimero().getNombre());
this.recorrido=recorrido.getPrimero();
}//if
else
{
System.out.println("Enfilando " + nuevo_nodo_local.getNombre());
this.recorrido.setPrimero(nuevo_nodo_local);//Si no es asi entonces, va dentro del while.
break;
}//else
}//while
System.out.println("Saliendo de while");
}//else
System.out.println("Saliendo del metodo.");
//cola_de_nodos=recorrido;
}//apilar
//Se muestra el primer nodo de la pila pero sin borrarlo.
public Nodo_pila ver_primer_nodo()
{
if(pila_de_nodos!=null)
{
this.primero= new Nodo_pila(this.pila_de_nodos.getNombre(), pila_de_nodos.getFecha(), pila_de_nodos.getValor(), pila_de_nodos.getDetalles() );
return primero;
}//if
return null;
}//ver_primer_nodo
}//class Pila
//Se usaré la misma interfas visual que el ejemplo de la cola.
class Form_pila extends JFrame
{
private JLabel jlNombre=new JLabel("Nombre"), jlValor=new JLabel("Valor"), jlFecha=new JLabel("Fecha"), jlDetalles=new JLabel("Detalles");
private JTextField jtNombre=new JTextField(), jtValor=new JTextField(), jtFecha=new JTextField();
private Nodo_pila un_nodo=new Nodo_pila();
private Pila pila=new Pila();
private JTextArea jtaDetalles=new JTextArea();
private JScrollPane jspDetalles=null;
private JMenuBar jmbBarra=new JMenuBar();
private JMenu jmArchivo=new JMenu("Archivo"), jmVer=new JMenu("Ver"), jmAcciones=new JMenu("Acciones");
private JMenuItem jmiMeter_en_la_pila=new JMenuItem("Meter en la pila"), jmiSalir=new JMenuItem("Salir"), jmiVer_primero_en_la_cola=new JMenuItem("Primero en la cola"), jmiSacar_el_primero_de_la_cola=new JMenuItem("Sacar el primero de la cola"), jmiVer_largo_de_la_cola=new JMenuItem("Largo de la cola");
private Eventos_para_la_pila controlador_de_eventos=new Eventos_para_la_pila(this);
public Form_pila()
{
super("Pila");
this.inicio();
//Datos de prueba
Nodo_pila nuevo=new Nodo_pila("Rafael", "25 de enero de 1978", 40, "Amo programar");
this.pila.apilar(nuevo);
nuevo=new Nodo_pila("Yannia", "2001", 24, "Una persona que conocí a mis 24 años.");
this.pila.apilar(nuevo);
nuevo=new Nodo_pila("Cola", "2018", 40, "Las colas o flujos de datos.\nEs una tecnica que conocí a la perfeccion en 2018.");
this.pila.apilar(nuevo);
}//Constructor
private void inicio()
{
this.setSize(230,290);
this.setLayout(null);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(3);
this.setResizable(false);
jspDetalles=new JScrollPane(jtaDetalles);
//Estableciendo el tamaño y posicion de los controles.
jlNombre.setBounds(5, 5, 100, 25);
jtNombre.setBounds(55, 5, 150, 25);
jlFecha.setBounds(5, 35, 100, 25);
jtFecha.setBounds(55, 35, 150, 25);
jlValor.setBounds(5, 65, 100, 25);
jtValor.setBounds(55, 65, 150, 25);
jlDetalles.setBounds(5, 100, 100, 25);
jspDetalles.setBounds(5, 125, 205, 100);
this.jtaDetalles.setBounds(5, 125, 205, 100);
//Añadiendo los controles.
this.getContentPane().add(this.jlNombre);
this.getContentPane().add(this.jlFecha);
this.getContentPane().add(this.jlValor);
this.getContentPane().add(this.jlDetalles);
this.getContentPane().add(this.jtNombre);
this.getContentPane().add(this.jtFecha);
this.getContentPane().add(this.jtValor);
this.getContentPane().add(this.jspDetalles);
//Añadiendo la barra de menu.
this.setJMenuBar(jmbBarra);
//Añadiendo el menu a la barra de menu.
jmbBarra.add(this.jmArchivo);
jmbBarra.add(jmVer);
jmbBarra.add(this.jmAcciones);
//Añadiendo los items de cada menu.
jmArchivo.add(jmiSalir);
jmAcciones.add(this.jmiMeter_en_la_pila);
jmAcciones.addSeparator();
jmAcciones.add(this.jmiSacar_el_primero_de_la_cola);
jmVer.add(this.jmiVer_largo_de_la_cola);
jmVer.addSeparator();
jmVer.add(this.jmiVer_primero_en_la_cola);
//Añadiendo los eventos.
jmiSalir.addActionListener(controlador_de_eventos);
this.jmiMeter_en_la_pila.addActionListener(controlador_de_eventos);
this.jmiSacar_el_primero_de_la_cola.addActionListener(controlador_de_eventos);
this.jmiVer_largo_de_la_cola.addActionListener(controlador_de_eventos);
this.jmiVer_primero_en_la_cola.addActionListener(controlador_de_eventos);
}//inicio
private void setTextos(Nodo_pila nuevo_nodo)
{
if(nuevo_nodo!=null)
{
this.jtNombre.setText(nuevo_nodo.getNombre());
this.jtFecha.setText(nuevo_nodo.getFecha());
this.jtValor.setText("" + nuevo_nodo.getValor());
this.jtaDetalles.setText(nuevo_nodo.getDetalles());
}//if
else
{
this.jtNombre.setText("");
this.jtFecha.setText("");
this.jtValor.setText("");
this.jtaDetalles.setText("");
}//else
}//getTextos
private Nodo_pila getTextos()
{
this.un_nodo=new Nodo_pila(jtNombre.getText(), jtFecha.getText(), Integer.parseInt(jtValor.getText()), jtaDetalles.getText());
return un_nodo;
}//getTextos
public void click_ver_primero_en_la_pila(ActionEvent evt)
{
if(evt.getActionCommand().equalsIgnoreCase(this.jmiVer_primero_en_la_cola.getText())==true)
{
un_nodo=this.pila.ver_primer_nodo();
this.setTextos(un_nodo);
}//if
}//click_ver_primero_en_la_pila
public void click_ver_largo_de_la_pila(ActionEvent evt)
{
if(evt.getActionCommand().equalsIgnoreCase(this.jmiVer_largo_de_la_cola.getText())==true)
{
JOptionPane.showMessageDialog( null, "Largo de la cola: " + this.pila.getLargo_de_la_cola() );
}//if
}//click_ver_largo_de_la_pila
public void click_sacar_el_primero_de_la_pila(ActionEvent evt)
{
if(evt.getActionCommand().equalsIgnoreCase(this.jmiSacar_el_primero_de_la_cola.getText())==true)
{
un_nodo=this.pila.sacar_primero_y_verlo();
this.setTextos(un_nodo);
}//if
}//click_sacar_el_primero_de_la_pila
public void click_salir(ActionEvent evt)
{
if(evt.getActionCommand().equalsIgnoreCase(this.jmiSalir.getText())==true)
{
System.exit(0);
}//if
}//click_salir
public void click_meter_en_la_pila(ActionEvent evt)
{
if(evt.getActionCommand().equalsIgnoreCase(this.jmiMeter_en_la_pila.getText())==true)
{
un_nodo= this.getTextos();
this.pila.apilar(un_nodo);
this.setTextos(null);
}//if
}//click_meter_en_la_pila
}//Form_cola
class Eventos_para_la_pila implements ActionListener
{
//Este class es un controlador de eventos.
private Form_pila frm_cola=null;
public Eventos_para_la_pila(Form_pila nuevo_form_cola)
{
this.frm_cola=nuevo_form_cola;
}//Constructor
@Override
public void actionPerformed(ActionEvent evt)
{
if(this.frm_cola!=null)
{
frm_cola.click_meter_en_la_pila(evt);
frm_cola.click_sacar_el_primero_de_la_pila(evt);
frm_cola.click_salir(evt);
frm_cola.click_ver_largo_de_la_pila(evt);
frm_cola.click_ver_primero_en_la_pila(evt);
}//if
}//actionPerformed
}//Eventos