Académique Documents
Professionnel Documents
Culture Documents
Fajardo, Daniel
Sendn, Alba
INCIDE:
Definicin de Pilas
Concepto de Pila.3
Operaciones fundamentales3
Otras operaciones...4
Programa Demo.
Referencias.
DESCRIPCIN DE PILA
DEFINICION: Una pila (stack) es un tipo fundamental de lista (Tipo de dato
abstracto fundamental) en la que todas las inserciones y supresiones de
elementos solo se pueden realizar desde una nica posicin, el extremo, la cima
o tope de la pila (TOP).
El modelo intuitivo de una pila es precisamente una pila de monedas
puestas sobre una mesa, o de cajas sobre el piso, o de bandejas en una estantera,
situaciones todas en las que solo es conveniente quitar o agregar un objeto del
extremo superior de la pila, al que se denominara en lo sucesivo tope.
CREAR: Lo que hace esta operacin es inicializar una pila como pila
vaca.
BORRAR: Esta operacin lo que hace es convertir una pila P en una pila
vaca.
VACIA?: Devuelve verdadero si la pila no tiene elementos, y falso en
caso contrario. No podremos hacer POP ya que se producira un desbordamiento
negativo (underflow) al no tienen ningn elemento que eliminar.
LLENA?: Ocurre lo mismo que con el caso VACIA? Solo que en este
caso te devuelve verdadero si la pila esta llena y no podemos insertar ningn
elemento ms a no ser que eliminemos alguno antes. Si tratsemos de insertar un
elemento ms se producir un error a causa de un desbordamiento (overflow).
Las pilas pueden representarse grficamente de varias maneras, entre las
cuales destacan las siguientes.
Llamadas a subprogramas:
Equilibrado de smbolos.
Tambin pueden utilizarse las pilas para revisar programas en busca de
errores, como por ejemplo en el caso de los smbolos.
En cada compilador se utilizan las pilas para comprobar si se han
producido errores, para que cada parntesis, llave o corchete de apertura tenga su
correspondiente cierre. Es decir, que si un programa presenta ms smbolos de
apertura que de clausura, el programa tendra errores y no seria vlido.
Tambin tenemos que tener en cuenta el orden en el que estn dichos
smbolos, porque puede que aunque tenga los mismos smbolos de apertura que
de clausura, tenga errores, ya que dichos smbolos no estn colocados
correctamente. Por ejemplo, si nos encontramos en este caso: ([{])} el programa
dara un error, ya que la segunda llave no esta colocado en su lugar y trastocara
toda la estructura interna del programa.
Una vez finalizada la lectura del fichero sabremos si estn bien anidados,
y por lo tanto si el programa es aparentemente correcto si y solo si la pila esta
vaca, ya que cada smbolo que hemos abierto, lo habremos cerrado
correctamente.
Pero este programa tiene una pega, ya que si el fichero que estamos
leyendo con el contenido del programa tiene comentarios en los que escribe
smbolos no anidados o errneamente colocados, no afectara al programa que
queremos revisar ya que es un comentario, pero si que afectara al nuestro, ya
que la pila no quedara vaca. Es decir, que un trozo de cdigo bien hecho puede
interpretarse como un trozo con errores. Algn ejemplo:
/*Con un comentario as ( [ ) ] el programa nos dara un error*/
Printf (con una expresin as tambin nos dara un error %c:, })
Por lo tanto si queremos utilizar este programa para depurar errores un
nuestro programa, tendremos que asegurarnos previamente de que los
comentarios que hemos puesto son correctos y que no pueden inducir a error al
igual que los smbolos que utilizamos como escritura tampoco nos van a dar
ningn problema.
Para un programa como este emplearemos listas enlazadas, pues no
sabemos cual es la longitud del fichero y tampoco cual es la cantidad de
smbolos que este contiene, por lo que un vector podra quedarse corto o pasarse
de largo.
Parntesis ( )
Potencial ^
Producto/cociente * /
Suma/resta + -
Tambin hay que tener en cuenta que cuando se evala una operacin se
hace de izquierda a derecha, excepto en el caso de las potencias, que se hace de
derecha a izquierda.
Esta forma de escribir una expresin, se denomina notacin usual o
infija.
Existen otras formas de escribir expresiones aritmticas, en el que se
diferencian por la situacin de los operadores respecto de los operandos. La
forma en la que los operadores se colocan delante de los operandos es conocida
como notacin polaca o prefija.
Vemos un ejemplo:
Notacin infija: a*b/(a+c)
Notacin infija
Notacin postfija
2*(3+8/(6-4))
23864-/+*
3+2*7-1
327*+1-
1*2*3*4+5
12*3*4*5+
Para ello tendremos que emplear un tipo TDA pila. Veamos que ocurre
en cada uno de los casos.
10
+
(
*
abc+
abc+de
abc+def
(
*
el ( se escribe en la pila
el operando d pasa al array, el / a la pila, y e pasa al array
^ lo metemos en la pila, y f lo escribimos en el fichero.
11
abc+def^/-g
12
TOPE (Pila) = 7
POP (Pila)
TOPE (Pila):=2
POP (Pila)
7*2=14
PUSH (pila, 14)
14
3
Ahora nos encontramos con el operador +, y procedemos de igual
manera:
TOPE (Pila)=14
POP (Pila)
TOPE (Pila)=3
POP (Pila)
14+3=17
PUSH (Pila, 17)
PUSH (Pila, 1)
1
17
Nos encontramos con el operador - .
Lo que hacemos es sacar los dos valores de la pila con y resolver, y ese
ser el resultado: 17 1= 16
Por lo tanto 327*+1- = 16
13
14
}pila;
/*El tipo elemento variar, al igual que el tam_mx, dependiendo del
programa*/
15
16
Elemento = E;
Nodo = registro de
info: elemento;
sgte: puntero a Nodo;
fin registro;
Pila = puntero a NODO.
Crear_pila(PILA *P){
P->longitud=0;
P->prim=NULL;
}
/*Creaciones de la pila*/
/*libera la pila*/
17
PROGRAMA DEMO:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*Declaraciones*/
typedef int elemento;
struct NODE{
elemento info;
struct NODE *sgte;
};
typedef struct NODE nodo;
typedef NODE *POSICION;
typedef struct {
int longitud;
POSICION prim;
} PILA;
/*Creaciones de la pila*/
void crear_pila(PILA *P)
{
Plongitud=0;
Pprim=NULL;
}
/* Creacin de un nodo a partir de un elemento dado */
NODE * crea_nodo (elemento *i)
{
static NODE *p;
p = (NODE *) malloc (sizeof(NODE));
if (p == NULL)
printf ("\nError. No puedo crear puntero a estructura\n");
else{
pinfo= *i;
/* Copio datos originales, en campo info de nodo creado */
psgte = NULL;
}
18
Return (p);
}
/*la pila est vaca?*/
int VACIA (PILA *P)
{
int resp,tam;
tam = Plongitud;
resp = (tam == 0)?1:0;
return resp;
}
/*Devuelve el elemento tope de la pila*/
elemento TOPE (PILA *P)
{
if (VACIA(P))
printf ("No existe tope.\n");
else
return (P prim info);
}
/*Elimina el tope de la pila*/
void POP (PILA *P)
{
NODE *q;
if (VACIA (P) )
printf ("No existe tope,ya que la pila est vaca.\n" );
else {
q = Pprim;
Pprim = qsgte;
free(q);
Plongitud--;
}
}
/*libera la pila*/
void DESTRUIR (PILA *P)
{
While (!VACIA(P))
POP (P);
}
/*Apila un elemento ms*/
void PUSH (PILA *P,elemento *x)
{
POSICION temp;
temp = crea_nodo(x);
tempinfo =*x;
19
if(VACIA(P)){
P prim = temp;
Temp sgte = NULL;
}
else{
temp sgte = Pprim;
P prim = temp;
}
P longitud++;
}
/*Da la vuelta a la pila*/
PILA GIRA (PILA *P)
{
PILA S;
crear_pila (&S);
elemento r;
do{
r = TOPE (P);
PUSH (&S, &r);
POP (P);
}while (VACIA(P) == 0);
return S;
}
/*Mostrar el contenido de la pila*/
void contenido_pila(PILA *P)
{
PILA S;
elemento r;
crear_pila (&S);
S = GIRA (P);
20
FILE *in;
elemento x;
int opcion;
int resp;
char nombre[20];
char linea[10];
do{
printf("Elije una de las siguientes opciones:\n1. Crear una pila con los datos de un
fichero.\n2. Crear una pila con los datos por teclado.\n3. Guardar una pila en un fichero.\n4.
Borrar una pila.\n5. Insertar un elemento en una pila.\n6. Eliminar un elemento en una pila.\n7.
Mostrar el contenido de una pila.\n8. Terminar.\n");
scanf("%d",&opcion);
if (opcion == 1){
/*Abre un archivo, lee los datos y los mete en una pila*/
crear_pila (&P);
printf("dame el nombre del fichero del que sacar los datos(con extension .txt)");
scanf("%s",nombre);
if ((in = fopen(nombre, "r")) != NULL){
do{
fscanf (in,"%d",&x);
PUSH (&P,&x);
}while (fgets(linea,10,in) != NULL);
fclose(in);
}
else
printf ("No se pudo abrir el fichero ");
}
if (opcion == 2){
/*Crea una pila mediante los datos que le das por teclado*/
crear_pila(&P);
do{
21
do{
fprintf(in,"%d\n",TOPE(&S));
POP (&S);
Resp = VACIA(&S);
}while (resp==0);
}
else
printf("No se pudo abrir el fichero");
}
if (opcion == 4){
DESTRUIR (&P);
}
/*Elimina la pila*/
if (opcion == 5){
/*En esta funcin mete un elemento a la pila*/
printf("\nDame el elemento que quieres introducir");
scanf("%d", &x);
PUSH (&P, &x);
}
if (opcion == 6){
POP (&P);
}
if (opcion == 7){
contenido_pila (&P);
}
}while(opcion!=8);
}
REFERENCIAS:
Libros:
9
9
9
9
Paginas web:
9 www.fcad.uner.edu.ar/C_LicSistemas/
Materias/est_datos/MartinezQuiroga_06PilasyFilas.pdf -
9 www.politeca.ing.ula.ve/Contenido/Digiteca/ProyectosTesisGrado/Pregrado/Uni
versidaddelosAndes/IngenieriaSistemas/DepartamentoComputacion/2005/Rodri
guezJose.pdf
22