Transcript La Pila
Estructura de Datos En C++ Dr. Romeo Sánchez Nigenda. E-mail: [email protected] http://yalma.fime.uanl.mx/~romeo/ Oficina: 1er. Piso del CIDET. Oficina con Dr. Oscar Chacón Horas de Tutoría: 10am-11am Martes y Jueves, 3:30pm-4:30pm Miércoles, 2:00pm-4:00pm Viernes. Website: http://yalma.fime.uanl.mx/~romeo/ED/2011/ Sesiones: 48 Objetivo General: Conocerá y manejará las estructuras internas de información Temario: 1. 2. 3. 4. 5. 6. 7. 8. 9. Conceptos Básicos La Pila 40% Tareas Colas 30% Examen Parcial Recursión 30% Examen Final Listas 10% Participación Árboles Ordenamiento Búsqueda Administración de Almacenamiento Total a calificar: 110 puntos. Material de apoyo: Estructura de Datos con C y C++. Yedidyah Langsam, Moshe J. Augenstein, Aaron M. Tenenbaum, Brooklyn College Segunda Edición, Prentice-Hall. Algorithms. Third Edition. Parts 1-4, Fundamentals Data Structures Sorting Searching Robert Sedgewick. Estructura de Datos. Román Martínez, Elda Quiroga. Thomson Learning. Cualquier libro de Estructura de Datos! Software: Compiladores GCC (GNU Compiler Collection) IDEs (Integrated Development Environment): http://www.eclipse.org/downloads/ http://kdevelop.org/ http://www.bloodshed.net/devcpp.html 2. La Pila (Stack) Objetivo: El alumno aprenderá el concepto de la estructura denominada la pila y manejará la inserción y eliminación de elementos en ella, así como sus aplicaciones Temario: ◦ ◦ ◦ ◦ Definición y ejemplos Representación de Pilas Operaciones con Pilas Aplicaciones La Pila (Stack) Conjunto de elementos en el cual se puede agregar y eliminar elementos por un extremo, el cual es llamado el tope o parte superior (top) de la pila. Tope F G E F D Agrega ‘G’ Tope E C D B C A B A Último elemento insertado es el primero en suprimirse (estructura LIFO). El único acceso es el tope de la pila La Pila: Operaciones Primitivas Agregar (push(i)): Agrega elemento i al tope de la pila Remover (pop()): Remueve elemento del tope de la pila, y se aplica a pilas no vacías. Stacktop : Retorna el elemento superior de la pila sin quitarlo (pop + push). StackEmpty: Retorna verdadero si la pila está vacía, falso en lo contrario C Vacía = True B B B A A A A A D Push(A) Push(B) Push(C) Pop() Pop() Push(D) Ejemplo Para verificar que una expresión aritmética es correcta verificamos que: Sus paréntesis están balanceados, es decir que el número de paréntesis que abres es el mismo al número de paréntesis que cierras. ((5+8)*10)/(3+5-9): Cada paréntesis izquierdo abre un ámbito, y cada derecho lo cierra. La profundidad de anidamiento en un determinado punto es la cantidad de ámbitos abiertos. Debe ser 0 en una expresión balanceada. ( ( ( Push(‘(’) Push(‘(’) 5, +, 8 ( Pop () *, 10 / Pop () ( Push(‘(’) 3,+,5,-,9 Representación de Pilas Una pila requiere básicamente de dos elementos: ◦ Una variable suficientemente grande para almacenar los elementos insertados en la pila (por ejemplo un arreglo). ◦ Un campo que registre la posición actual del tope de la pila Ejemplo: #define STACKSIZE 100 //Tamaño de la Pila struct pila{ int cima; int elementos[STACKSIZE]; } struct pila p; Representación de Pilas La operación isStackEmpty int isStackEmpty(struct pila * P){ return (P->cima == -1); } La operación Pop int pop (struct pila * P){ if(isStackEmpty(P)){ cout<<“Error Pila Underflow”; exit(1): } return (P->elementos[P->cima--]); } Cima return 5 7 5 Cima-- 7 La operación Push void push(struct pila * P, int elemento){ if(cima== STACKSIZE-1){ cout<<“Error Pila Overflow”; exit(1): } S->cima++; S->elementos[cima]=elemento; } Cima++ Cima 5 5 7 7 Representación de Pilas La operación stackTop Int stackTop(struct pila * P){ if(isStackEmpty(P)){ cout<<“Error Pila Vacía”; exit(1): } return P->elementos[P->cima]; } Ejemplo: Evaluación de una expresión postfija. Los prefijos pre, post e inter hacen referencia a la posición relativa del operador (e.g., +,-,*,/,$) A + B : Interfija AB + : Postfija + AB : Prefija Cuando evaluamos una expresión aritmética, utilizamos las reglas de precedencia de los operadores, por ejemplo: ◦ Exponenciación ($), ◦ Multiplicación, División ◦ Adición y Sustracción ◦ Operadores de misma precedencia se utiliza la regla de izquierda a derecha, exceptuando la exponenciación que es de derecha a izquierda Ejemplos: Evaluación a una expresión postfija. Siguiendo las reglas de precedencia A + (B * C) A + (B C *) A (B C *) + ABC*+ (A + B) * C (A B +) * C (A B +) C * AB+C* A+B–C AB+-C AB+C- • (A + B) * (C – D) • (A B +) * (C – D) • (A B +) * (C D -) • (A B +) (C D -) * •A B + C D - * • A $ B * C – D + E / F / (G + H) • A $ B * C – D + E / F / (G H +) •A B $ C * … E F / G H + / •A B $ C * D - E F / G H + / + • A – B / (C * D $ E) • A – B (C * D $ E) / • A – B (C * D E $) / • A – B (C D E $ *) / • A B (C D E $ *) / •A B C D E $ * / - Ejemplo: Algoritmo para evaluar una expresión Postfija Cada operador en una cadena postfija hace referencia a los dos operandos anteriores en la cadena Uno de los operandos puede ser el resultado de aplicar un operador anterior Mipila = 0 //Pila vacía Cadena = getCadena() //Obtén la cadena postfija de entrada Int index = 0 //Apunta al primer elemento de la cadena while((symb = cadena[index] )!= NULL){ //Symb representa el carácter que se checará if(symb es un operando) push(Mipila, symb) else{ //Symb es un operador operando2 = pop(Mipila) operando1 = pop(Mipila) value = resultado de aplicar symb a operando1 y operando2 push(Mipila, value) index++ } return pop(Mipila) }