Sei sulla pagina 1di 3

Ejercicios 821

Respuestas a los ejercicios de autoevaluación


20.1 a) referenciada. b) new. c) pila. d) predicado. e) PEPS ( primero en entrar, primero en salir). f ) enlace. g) delete.
h) cola. i) árbol. j) UEPS (último en entrar, primero en salir). k) binario. l) raíz. m) hijo o subárbol. n) hoja. o) inorden,
preorden, postorden y orden de nivel.
20.2 Es posible insertar y eliminar un nodo en cualquier lugar de una lista enlazada. Los nodos en una pila pueden insertarse
solamente en la parte superior y eliminarse desde la parte superior de una pila.
20.3 Una estructura de datos tipo cola permite eliminar nodos sólo desde su cabeza, e insertarlos sólo en su rabo. Una cola se
conoce como estructura de datos PEPS ( primero en entrar, primero en salir). Una estructura de datos tipo pila permite agregar
nodos a la pila y eliminarlos de ésta sólo desde su parte superior. Una pila se conoce como estructura de datos UEPS (último
en entrar, primero en salir).
20.4 a) Las clases nos permiten crear tantas instancias de todos los objetos de estructura de datos de cierto tipo (es decir,
clase) como sea necesario.
b) Las plantillas de clases nos permiten instanciar clases relacionadas, cada una de ellas basada en distintos parámetros
de tipo; así, podemos generar tantos objetos de cada clase de plantilla como sea necesario.
c) La herencia nos permite reutilizar código de una clase base en una clase derivada, de manera que la estructura de
datos de la clase derivada también sea una estructura de datos de la clase base (esto es, con herencia public).
d) La herencia privada nos permite reutilizar partes del código de una clase base para formar una estructura de datos
de clase derivada; debido a que la herencia es private, todas las funciones miembro public de la clase base se con-
vierten en private en la clase derivada. Esto nos permite evitar que los clientes de la estructura de datos de clase
derivada accedan a las funciones miembro de la clase base que no son aplicables a la clase derivada.
e) La composición nos permite reutilizar código al hacer que una estructura de datos de un objeto de una clase sea
miembro de una clase compuesta; si hacemos al objeto de la clase un miembro private de la clase compuesta, enton-
ces las funciones miembro public del objeto de la clase no están disponibles a través de la interfaz del objeto.
20.5 El recorrido inorden es:
11 18 19 28 32 40 44 49 69 71 72 83 92 97 99
El recorrido preorden es:
49 28 18 11 19 40 32 44 83 71 69 72 97 92 99
El recorrido postorden es:
11 19 18 32 44 40 28 69 72 71 92 99 97 83 49

Ejercicios
20.6 Escriba un programa para concatenar dos objetos de lista enlazada de caracteres. El programa deberá incluir la función
concatenar, que reciba referencias a ambos objetos lista como argumentos y que concatene la segunda lista con la primera.
20.7 Escriba un programa para combinar dos objetos de lista ordenada de enteros en un solo objeto de lista ordenada de
enteros. La función combinar debe recibir referencias a cada uno de los objetos lista que se van a combinar, y debe devolver una
referencia a objeto lista en el que se colocarán los elementos combinados.
20.8 Escriba un programa para insertar 25 enteros aleatorios de 0 a 100 en orden, en un objeto lista enlazada. El programa
deberá calcular la suma de los elementos y el promedio de punto f lotante de los elementos.
20.9 Escriba un programa para crear un objeto lista enlazada de 10 caracteres, y que luego cree un segundo objeto lista que
contenga una copia de la primera lista, pero en orden inverso.
20.10 Escriba un programa que reciba una línea de texto como entrada y que utilice un objeto pila para imprimir la línea en
orden inverso.
20.11 Escriba un programa que utilice un objeto pila para determinar si una cadena es una palíndroma (es decir, que la cade-
na se deletree en forma idéntica, tanto al revés como al derecho). El programa debe ignorar espacios y puntuación.
20.12 Los compiladores utilizan pilas para ayudar en el proceso de evaluar expresiones y generar código en lenguaje máquina.
En este ejercicio y en el siguiente, investigaremos cómo los compiladores evalúan expresiones aritméticas que consisten sola-
mente de constantes, operadores y paréntesis.
Los humanos generalmente escriben expresiones como 3 + 4 y 7 / 9, en donde el operador (+ o / aquí) se escribe entre sus
operandos; a esta notación se le conoce como notación infijo. Las computadoras “prefieren” la notación postfijo, en donde el
operador se escribe a la derecha de sus dos operandos. Las anteriores expresiones infijo aparecerían en notación postfijo como
3 4 + y 7 9 /, respectivamente.

www.FreeLibros.me

C020_Deitel C++.indd 821 6/3/08 8:55:35 AM


822 Capítulo 20 Estructuras de datos
Para evaluar una expresión infijo compleja, un compilador primero convertiría la expresión en notación postfijo y evaluaría
la versión postfijo de la expresión. Cada uno de estos algoritmos requiere solamente de una pasada de izquierda a derecha de la
expresión. Cada algoritmo utiliza un objeto pila para dar soporte a su operación y, en cada algoritmo, la pila se utiliza para un
propósito distinto.
En este ejercicio, usted escribirá una versión en C++ del algoritmo de conversión infijo a postfijo. En el siguiente ejercicio,
usted escribirá una versión en C++ del algoritmo de evaluación de expresiones postfijo. En un ejercicio posterior, descubrirá
que el código que escriba en este ejercicio podrá ayudarle a implementar un compilador completamente funcional.
Escriba un programa para convertir una expresión aritmética infijo ordinaria (suponga que se escribe una expresión válida)
con enteros de un solo dígito, como:
(6 + 2) * 5 - 8 / 4

a una expresión postfijo. La versión postfijo de la expresión infijo anterior es:


6 2 + 5 * 8 4 / -

El programa debe leer la expresión y colocarla en el arreglo de caracteres infijo, y utilizar las versiones modificadas de las
funciones de la clase pila, implementadas en este capítulo para ayudar a crear la expresión postfijo en el arreglo de caracteres
postfijo. El algoritmo para crear una expresión postfijo es el siguiente:
1) Meter un paréntesis izquierdo '(' en la pila.
2) Agregar un paréntesis derecho ')' al final de infijo.
3) Mientras que la pila no esté vacía, leer infijo de izquierda a derecha y hacer lo siguiente:
Si el carácter actual en infijo es un dígito, copiarlo al siguiente elemento de postfijo.
Si el carácter actual en infijo es un paréntesis izquierdo, meterlo a la pila.
Si el carácter actual en infijo es un operador,
Sacar los operadores (si los hay) de la parte superior de la pila, mientras tengan igual o mayor precedencia
que el operador actual, e insertar en postfijo los operadores que se sacaron.
Meter en la pila el carácter actual en infijo.
Si el carácter actual en infijo es un paréntesis derecho:
Sacar operadores de la parte superior de la pila e insertarlos en postfijo, hasta que haya un paréntesis
izquierdo en la parte superior de la pila.
Sacar (y descartar) el paréntesis izquierdo de la pila.
Las siguientes operaciones aritméticas se permiten en una expresión:
+ suma
- resta
* multiplicación
/ división
^ exponenciación
% módulo
[Nota: asumimos la asociatividad de izquierda a derecha para todos los operadores, para los fines de este ejercicio]. La pila debe
mantenerse con nodos de pila que contengan, cada uno, un miembro de datos y un apuntador al siguiente nodo de la pila.
Algunas de las herramientas funcionales que puede ser conveniente proporcionar son:
a) la función convertirAPostfijo, que convierte la expresión infijo a notación postfijo
b) la función esOperador, el cual determina si c es un operador
c) la función precedencia, que determina si la precedencia de operador1 es menor, igual o mayor que la precedencia
de operador2 (la función devuelve -1, 0 y 1, respectivamente)
d) la función push, que mete un valor en la pila
e) la función pop, que saca un valor de la pila
f ) la función parteSuperiorPila, que devuelve el valor de la parte superior de la pila sin sacarlo de la misma
g) la función estaVacia, que determina si la pila está vacía
h) la función imprimirPila, que imprime la pila
20.13 Escriba un programa para evaluar una expresión postfijo (asuma que es válida) tal como:
6 2 + 5 * 8 4 / -

El programa debe leer una expresión postfijo que consista de dígitos y operadores, para después colocarla en un arreglo de
caracteres. Utilizando versiones modificadas de las funciones de la clase pila implementadas anteriormente en este capítulo, el
programa deberá explorar la expresión y evaluarla. El algoritmo es el siguiente:
1) Adjuntar el carácter nulo ('\0') al final de la expresión postfijo. Al encontrar el carácter nulo, ya no habrá nada más
qué procesar.

www.FreeLibros.me

C020_Deitel C++.indd 822 6/3/08 8:55:36 AM


Ejercicios 823
2) Mientras no se encuentre el carácter '\0', leer la expresión de izquierda a derecha.
Si el carácter actual es un dígito,
Meter su valor entero en la pila (el valor entero de un carácter tipo dígito es su valor en el conjunto de
caracteres de la computadora menos el valor de '0' en el conjunto de caracteres de la computadora).
En caso contrario, si el carácter actual es un operador:
Sacar los dos elementos superiores de la pila y colocarlos en las variables x y y.
Calcular y operador x.
Meter el resultado del cálculo en la pila.
3) Al encontrar el carácter nulo en la expresión, sacar el valor superior de la pila. Éste es el resultado de la expresión
postfijo.
[Nota: en el paso 2 anterior, si el operador es '/', el valor superior de la pila es 2 y el siguiente elemento en la pila es 8, entonces
sacar 2 y colocarlo en x, sacar 8 y colocarlo en y, evaluar 8 / 2 y meter el resultado (4) de vuelta en la pila. Esta nota también se
aplica al operador '-']. Las operaciones aritméticas permitidas en una expresión son:
+ suma
- resta
* multiplicación
/ división
^ exponenciación
% módulo
[Nota: vamos a suponer la asociatividad de izquierda a derecha para todos los operadores, para los fines de este ejercicio]. La pila
debe mantenerse con nodos de la pila que contengan un miembro de datos int y un apuntador al siguiente nodo de la pila. Tal
vez usted pueda proporcionar las siguientes herramientas funcionales:
a) la función evaluarExpresionPostfijo, que evalúa la expresión postfijo.
b) la función calcular, que evalúa la expresión op1 operador op2.
c) la función push, que mete un valor en la pila.
d) la función pop, que saca un valor de la pila.
e) la función estaVacia, que determina si la pila está vacía.
f ) la función imprimirPila, la cual imprime la pila.
20.14 Modifique el programa evaluador de expresiones postfijo del ejercicio 20.13, de manera que pueda procesar operandos
enteros mayores que 9.
20.15 (Simulación de supermercado) Escriba un programa que simule una línea para pagar en un supermercado. La línea es
un objeto cola. Los clientes (es decir, los objetos cliente) llegan en intervalos enteros aleatorios de 1 a 4 minutos. Además, a
cada cliente se le atiende en intervalos enteros aleatorios de 1 a 4 minutos. Obviamente, los ritmos necesitan balancearse. Si
el ritmo promedio de llegadas es mayor que el ritmo promedio de atención, la cola crecerá infinitamente. Incluso con ritmos
“balanceados”, el factor aleatorio puede aún provocar largas líneas. Ejecute la simulación del supermercado durante un día de
12 horas (720 minutos), utilizando el siguiente algoritmo:
1) Elegir un entero aleatorio entre 1 y 4 para determinar el minuto en el que debe llegar el primer cliente.
2) Al momento en que llegue el cliente:
Determinar el tiempo de atención del cliente (entero aleatorio de 1 a 4).
Empezar a atender al cliente.
Programar la hora de llegada del siguiente cliente (se suma un entero aleatorio de 1 a 4 al tiempo actual).
3) Para cada minuto del día:
Si llega el siguiente cliente,
Decirlo así.
Poner al cliente en la cola.
Programar la hora de llegada del siguiente cliente.
Si se terminó de atender al último cliente,
Decirlo así.
Sacar de la cola al siguiente cliente al que se va a atender.
Determinar el tiempo requerido para dar servicio al cliente
(se suma un entero aleatorio del 1 al 4 al tiempo actual).
Ahora ejecute su simulación durante 720 minutos y responda a cada una de las siguientes preguntas:
a) ¿Cuál es el máximo número de clientes en la cola, en cualquier momento dado?
b) ¿Cuál es el tiempo de espera más largo que experimenta un cliente?
c) ¿Qué ocurre si el intervalo de llegada se cambia de 1 a 4 minutos por un intervalo de 1 a 3 minutos?

www.FreeLibros.me

C020_Deitel C++.indd 823 6/3/08 8:55:36 AM

Potrebbero piacerti anche