Vous êtes sur la page 1sur 25

AE | TAD STACK

Universidad ORT Uruguay


Docente: Ing. Florencia
AGENDA
Introduccin.

Definicin del TAD Stack.

Estructura e Implementacin Dinmica.

Aplicacin Prctica.

Implementacin Esttica.
STACK - INTRODUCCIN
Un stack (o pila) es una clase especial de lista en la que
todas las inserciones y supresiones de elementos se
efectan sobre uno de sus extremos, llamado el tope del
stack.

Ejemplos de stack son:


Pilas de platos
Pilas de libros
Stack de ejecuciones

Este tipo de estructuras en las cuales el ltimo elemento


en entrar es el primero en salir se denomina LIFO (Last
In First Out).
STACK - INTRODUCCIN
STACK - OPERACIONES
Las operaciones fundamentales de un stack son:

Pre: El stack no est lleno.


push
Insertar un elemento.

Pre: El stack no est vaco.


pop
Elimina el ltimo elemento insertado.

Pre: El stack no est vaco.


top
Retorna el ltimo elemento insertado.
STACK - OPERACIONES
El TAD stack contiene las siguientes operaciones:
La operacin que construye un stack vaco, Constructor.

Una operacin que inserta un elemento en el tope del stack,


Push.

Una operacin que retorna el elemento que se encuentra en el


tope del stack, Top.

Una operacin que retorna el stack resultado de borrar el


elemento en el tope del stack, Pop.

Una operacin que testee si el stack es vaco, isEmpty.


STACK - LIFO
Estructura LIFO (Last in, first out)

Si realizamos las siguientes operaciones obtendremos:

mistack.Push(5)
mistack.Push(3)
mistack.Push(6)
mistack.Push(8) 8
6
mistack.pop() 3
mistack.pop() 5
3
mistack.top()
TAD STACK - DEFINICIN
public interface IStack {

Post.: Crea un stack vaco.


public Stack ();

Pre.: El stack no esta lleno.


Post.: Inserta el objeto "o" pasado como parmetro en el
stack.
public void push(Object o);

Pre.: El stack no es vaco.


Post.: Retorna el elemento ubicado en el tope del stack.
public Object top();

Pre.: El stack no es vaco.


Post.: Elimina el elemento ubicado en el tope del stack.
public void pop();
TAD STACK - DEFINICIN
Post.: Retorna true si y solo si el stack es vaco.
public boolean isEmpty();

Post.: Elimina todos los elementos del stack.


public void cleanStack();

Post.: Retorna true si y solo si el stack esta lleno.


public boolean isFull();

Pre.: El stack no es vaco.


Post.: Retorna y elimina el elemento ubicado en el tope
del stack.
public Object topAndPop();

}
STACK - IMPLEMENTACIN
Veremos dos implementaciones:

Lista enlazada

5
5 9 3 1 8 9
3
1
8
Array

8 1 3 9 5
TAD STACK IMPLEMENTACIN DINMICA
OPCIN 1: LISTA
PUSH
Insertar al inicio de la lista
POP
Eliminar el primer elemento de la lista
TOP
Retornar el primer elemento de la lista

La estructura a utilizar es anloga a la de una lista simplemente


encadenada.
STACK - ESTRUCTURA
class Stack {
NodoStack nodo;
}

class NodoStack {
Object elem;
NodoStack next;
}
TAD STACK IMPLEMENTACIN DINMICA
STACK DE NMEROS ENTEROS
public class NodoStack {

public int element;


public NodoStack next;

public NodoStack (int elem){


this.element = elem;
this.next = null;
}

public NodoStack (int elem, NodoStack n){


this.element = elem;
this.next = n;
}

}
TAD STACK IMPLEMENTACIN DINMICA
STACK DE NMEROS ENTEROS
public class Stack implements IStack{
private NodoStack inicio;

//Pos.: Constructor. Crea el stack vaco.


public Stack (){
this.inicio = null;
}

//Pos.: Retorna true sii el stack es vaco.


public boolean isEmpty() {
return this.inicio == null;
}

//Pos.: Borra todos los elementos del stack.


public void cleanStack() {
while (!this.isEmpty()){
this.pop();
}
}
TAD STACK IMPLEMENTACIN DINMICA
STACK DE NMEROS ENTEROS
//Pre.: El stack no es vaco.
//Pos.: Borra el elemento en el tope del stack.
public void pop() {
NodoStack aux = this.inicio;
this.inicio = this.inicio.next();
aux.next = null;
aux.borrar();
}

public void borrar(){


}

//Pre.: El stack no est lleno.


//Pos.: Inserta elem en el tope del stack.
public void push(int elem) {
NodoStack nuevo = new NodoStack(elem, this.incio);
this.inicio = nuevo;
}
TAD STACK IMPLEMENTACIN DINMICA
STACK DE NMEROS ENTEROS
//Pre.: El stack no es vaco.
//Pos.: Retorna el elemento en el tope del stack.
public int top() {
return this.inicio.element;
}

//Pos.: Retorna true sii el stack est lleno.


public boolean isFull(){
return false;
}

//Pre.: El stack no es vaco.


//Pos.: Retorna y borra el elemento en el tope del stack.
public int topAndPop(){
int elem = this.top();
this.pop();
return elem;
}
}
TAD STACK IMPLEMENTACIN ESTTICA
OPCIN 2: ARRAY
La clase StackArray contendr dos atributos:
theArray : array
topOfStack: int
(capacity: int para evitar el uso de length.)

El atributo topOfStack se inicializar en -1.


Lo que representa que el stack esta vaco.

PUSH
Incremento topOfStack e inserto en el
theArray[topOfStack]
POP
Decremento topOfStack
TOP
Retornar el valor theArray[topOfStack]
TAD STACK IMPLEMENTACIN ESTTICA
STACK DE NMEROS ENTEROS
public class StackArray implements IStack{

private int[] theArray;


private int topOfStack;
private int capacity;

//Pos.: Constructor. Crea el stack vaco.


public StackArray (int capacity){
theArray = new int[capacity];
topOfStack = -1;
capacity = capacity;
}

//Pos.: Deja el stack sin elementos.


public void cleanStack() {
topOfStack = -1;
}
TAD STACK IMPLEMENTACIN ESTTICA
STACK DE NMEROS ENTEROS
//Pos.: Retorna true sii el stack es vaco.
public boolean isEmpty() {
return topOfStack == -1;
}

//Pre.: El stack no es vaco.


//Pos.: Borra el elemento en el tope del stack.
public void pop() {
topOfStack--;
}

//Pre.: El stack no est lleno.


//Pos.: Inserta elem en el tope del stack.
public void push(int elem) {
topOfStack++;
theArray[topOfStack] = elem;
}
TAD STACK IMPLEMENTACIN ESTTICA
STACK DE NMEROS ENTEROS
// Pre.: El stack no es vaco.
// Pos.: Retorna el elemento en el tope del stack.
public int top() {
return theArray[topOfStack];
}

// Pos.: Retorna true sii el stack est lleno.


public boolean isFull(){
//return topOfStack == theArray.length()-1;
return topOfStack == capacity-1;
}

// Pre.: El stack no es vaco.


// Pos.: Retorna y borra el elemento en el tope del stack.
public int topAndPop(){
int elem = this.top();
this.pop();
return elem;
}}
TAD STACK IMPLEMENTACIONES
Vimos dos implementaciones:
Lista enlazada:
Todas las operaciones requieren de tiempo constante para su
ejecucin, ya que no dependen del tamao (excepto la
eliminacin de toda la estructura).
Estructura dinmica.

Array:
Todas las operaciones requieren de tiempo constante para su

ejecucin, ya que no dependen del tamao.


Evita el uso de punteros.
Es la solucin ms popular.

Requiere conocer el tamao de la pila. (estructura esttica)


EJEMPLO: BALANCEO DE PARNTESIS
Un compilador para un lenguaje de programacin, entre
otras cosas, verifica la correctitud sintctica de los
programas escritos en ese lenguaje.

Dada una lista de caracteres que slo puede contener los


elementos (, ), [, ], { y }, deseamos construir un
procedimiento que verifique que la expresin es
balanceada, donde, por ejemplo, las secuencias :
[()] y (){} son correctas, pero
[(]) y {( no lo son.
EJEMPLO: BALANCEO DE PARNTESIS
Construimos el stack vaco.
Mientras tengamos caracteres por leer, obtenemos el primero
Si es un smbolo de apertura (, [, {, lo agregamos al
stack.
Si es un smbolo de clausura ), ], }:
Si el stack es vaco, hay un error en la sintaxis de la expresin.
Si en el tope del stack se encuentra un smbolo que no matchea

con el smbolo que recin lemos, entonces la expresin tampoco es


correcta.
Si en el tope del stack se encuentra el smbolo que matchea con
el smbolo que acabamos de leer, borramos el tope del stack y
seguimos leyendo caracteres.
Sino es un smbolo de clausura ni de apertura lo ignoramos.
Si cuando no tenemos ms caracteres por leer y el stack est
vacio entonces la expresin es correcta, en caso contrario no lo
boolean esBalanceada (Lista chars, Stack st){
boolean resultado;
char entrada;
if chars.isEmpty()
resultado = st.isEmpty();
else{
entrada = chars.inicio.getElem(); //head
chars = chars.inicio.getSig(); //tail
case entrada
'{','[','(': {
st.Push(entrada);
resultado = esBalanceada(chars, st);
break;
}

'}',']',')': if (st.Empty())
resultado = false;
else{
if (st.Top() == match(entrada)){
st.Pop();
resultado = esBalanceada(chars,st);
}
else
resultado = false;
}
break;
}
return resultado;
}
EJEMPLO: STACK DE LLAMADOS (REPASO)
Cada vez que una funcin necesita llamar a otra funcin
o llamarse a si misma recursivamente, es preciso guardar
el contexto de ejecucin (valor de todas las variables y
dnde se debe retomar la ejecucin) en el stack de
llamados.

Cuando se termina la ejecucin de una funcin, se lee (y


se borra) del tope del stack para saber dnde debe seguir
la ejecucin y que valores contenan las variables.

Si el stack est vaco significa que no queda nada


pendiente por ejecutar.