En caso de implementar una pila mediante una lista enlazada, el

Anuncio
1. En caso de implementar una pila mediante una lista enlazada, el criterio más eficiente para
implementar las operaciones de apilar y desapilar es:
A. Para apilar, insertar un nodo al principio de la lista (el apuntado por la variable estática),
y para desapilar, eliminar el último nodo de la lista.
B. Realizar ambas operaciones al principio de la lista.
C. Realizar ambas operaciones al final de la lista.
2. Se proponen los siguientes tipos de datos para implementar una cola mediante una lista
enlazada por medio de punteros:
• Opción cola1.
class NodoCola {
int dato;
NodoCola siguiente;
}
public class tad_cola implements Cola {
private NodoCola inicio;
public tad_cola () {
inicio = null;
}
}
• Opción cola2.
class NodoCola {
int dato;
NodoCola siguiente;
}
public class tad_cola implements Cola {
private NodoCola principio;
private NodoCola fin;
public tad_cola () {
principio = null;
fin = null;
}
}
¿Cuál de las siguientes afirmaciones es correcta?
A. La opción cola2 no permite definir una cola.
B. Las dos opciones son válidas, sin embargo para la opción cola1 hay que realizar un
tratamiento, iterativo o recursivo, para hacer alguna de las operaciones básicas (encolar /
desencolar).
C. Las dos opciones son válidas, sin embargo la opción cola2 requiere la realización de un
tratamiento, iterativo o recursivo, para realizar alguna de las operaciones básicas (encolar /
desencolar).
3. El siguiente algoritmo que pretende eliminar de una lista calificada ordenada el elemento, si
existe, cuya clave coincida con el dato que se pasa como argumento:
static void eliminar (NodoLista lista, int dato) {
if (lista != null)
if (lista.clave < dato)
eliminar (lista.sig, dato);
else if (lista.clave == dato)
lista = lista.sig;
else System.out.println ("ERROR: La clave no existe");
else System.out.println ("ERROR: La clave no existe");
}
¿Cuál de las siguientes afirmaciones es correcta?
A. Funciona correctamente salvo al eliminar el primer elemento de la lista.
B. Funciona correctamente en cualquier caso.
C. No funciona en ningún caso.
4. El siguiente algoritmo pretende insertar un elemento (dato) en una lista calificada ordenada.
static void insertarIterativo (NodoLista lista, int dato) {
NodoLista anterior, actual, aux;
boolean encontrado;
anterior = lista;
actual = lista;
encontrado = false;
while ((actual != null) && !encontrado)
if (actual.clave >= dato)
encontrado = true;
else {
anterior = actual;
actual = actual.sig;
}
if (encontrado) {
if (actual.clave > dato) {
aux = new NodoLista (dato);
aux.sig = actual;
if (lista = actual)
lista = aux;
else anterior.sig = aux;
}
else System.out.println ("Error. La clave ya existe");
}
else if (actual == null) {
aux = new NodoLista (dato);
aux.sig = null;
if (lista = null)
lista = aux;
else anterior.sig = aux;
}
}
Este método:
A. No funciona para insertar un elemento al principio ni tampoco al final de la lista.
B. No funciona si la lista está vacía.
C. No funciona nunca.
5. El siguiente algoritmo pretende crear una lista ordenada ascendentemente (lista3) con los
elementos comunes de dos listas también ordenadas ascendentemente (lista1 y lista2):
static NodoLista mezclaAnd (NodoLista lista1, NodoLista lista2, NodoLista lista3) {
NodoLista resul;
if (lista1 == null && lista2 == null)
resul = null;
else if (lista1.clave < lista2.clave)
resul = mezclaAnd (lista1.sig, lista2, lista3);
else if (lista1.clave > lista2.clave)
resul = mezclaAnd (lista1, lista2.sig, lista3);
else {
lista3 = mezclaAnd (lista1.sig, lista2.sig, lista3);
resul = new NodoLista (lista1.clave, lista3);
}
return resul;
}
static void mezclaAnd (Lista lista1, Lista lista2, Lista lista3) {
lista3.inicio = mezclaAnd (lista1.inicio, lista2.inicio, lista3.inicio);
}
Este método:
A. Funciona correctamente sólo en el caso de que el último elemento de lista1 y el último de
lista2 coincidan.
B. Funciona correctamente sólo en el caso de que lista1 y lista2 tengan el mismo número de
elementos.
C. No funciona en ninguna circunstancia.
6. Se desea implementar una cola mediante una lista circular. ¿Cuál de las siguientes
afirmaciones es correcta?
A. La referencia puede apuntar tanto al primer como al último elemento de la lista, sin
embargo se producen algoritmos más eficientes si la referencia apunta al primero.
B. La referencia puede apuntar tanto al primer como al último elemento de la lista, sin
embargo se producen algoritmos más eficientes si la referencia apunta al último.
C. La referencia debe apuntar necesariamente al último elemento de la lista.
7. Dada la siguiente definición de lista con cabecera y centinela:
public class Lista {
public Lista () {
cab = new NodoLista ();
cent = new NodoLista ();
cab.sig = cent;
}
NodoLista cab, cent;
}
El siguiente método estático eliminar pretende borrar de una lista calificada ordenada con
cabecera y centinela el elemento, si existe, cuya clave coincida con el dato que se pasa como
argumento:
public static void eliminar (Lista listaCabeceraCentinela, int dato) {
eliminarElemento (listaCabeceraCentinela.cab, listaCabeceraCentinela.cent, dato)
}
static void eliminarElemento (NodoLista cab, NodoLista cent, int dato) {
NodoLista anterior, actual;
anterior= cab;
actual= anterior.sig;
cent.clave= dato;
while (actual.clave < dato) {
anterior= actual;
actual= actual.sig;
}
if ((actual == cent) || (actual.clave > dato))
System.out.println ("Error, elemento inexistente");
else anterior.sig= actual.sig;
}
Seleccione una respuesta.
A. Funciona correctamente salvo en el caso del primer elemento de la lista.
B. No funciona en ningún caso.
C. Funciona correctamente en cualquier caso.
8. Dada la siguiente definición de lista calificada ordenada doblemente enlazada:
class NodoLista {
int clave;
NodoLista sig, ant;
public NodoLista(int x) {
clave=x;
sig=null;
ant= null;
}
}
public class Lista {
public Lista () {
inicio = null;
}
NodoLista inicio;
}
El siguiente algoritmo pretende insertar un elemento, pasado como argumento, en una lista del
tipo anterior:
static void inser (Lista lista, int dato) {
NodoLista aux, listaAux = lista.inicio;
if (listaAux.clave == dato)
System.out.println ("Error. Elemento repetido");
else if (listaAux.clave > dato) {
aux = new NodoLista (dato);
aux.sig = listaAux;
aux .ant = listaAux.ant;
listaAux.ant = aux;
listaAux = aux;
lista.inicio = listaAux;
}
else if (listaAux.sig != null) {
lista.inicio = listaAux.sig;
inser (lista, dato);
listaAux.sig = lista.inicio;
lista.inicio = listaAux;
}
}
public static void insertar (Lista lista, int dato) {
if (lista.inicio == null) {
NodoLista aux = new NodoLista (dato);
aux.ant = null;
aux.sig = null;
lista.inicio = aux;
}
else inser (lista,dato);
}
Seleccione una respuesta.
A. Falla en caso de tratar de insertar un dato inferior al primero de los elementos de la lista.
B. Funciona correctamente.
C. Falla en caso de tratar de insertar un dato superior al último de los elementos de la lista.
Soluciones:
Pregunta Respuesta Justificación
1
B
De esta forma se accede directamente al “punto de acceso”
de la pila (sin necesidad de tratamientos iterativo (consumo
de tiempo) ni recursivo (consumo de tiempo y de memoria).
2
B
La opción cola1 sólo define un “punto de acceso” a la
estructura. Por tanto, para alcanzar el otro extremo habrá
que realizar un recorrido completo de la lista enlazada.
3
C
El parámetro lista va tomando, durante la fase de ida del
tratamiento recursivo, el valor de la referencia a cada uno de
los nodos de la lista hasta llegar al que se pretende eliminar.
En ese momento se modifica su valor y se retorna a la
instancia anterior. Para que el resultado tenga efecto la lista
debería pasarse por referencia: el argumento debería ser de
tipo Lista en vez de NodoLista, o bien devolver un NodoLista
como resultado para enlazar correctamente los nodos a la
vuelta.
4
B
Si la lista esta vacía no inserta el elemento. Además,
funciona para insertar un elemento al final pero no al
principio. Para que funcione en todos los casos se debería
pasar como argumento un elemento de la clase Lista, o bien
devolver como resultado un NodoLista para enlazar
correctamente los nodos a la vuelta
5
A
La primera condición debería ser:
if ((lista1 == null) || (lista2. == null))
6
B
Mediante la referencia al último elemento de una lista circular
se tiene acceso inmediato (sin necesidad de recorrer la lista)
a ambos extremos de la cola. La referencia cola, apuntaría al
último elemento de la lista, y cola.sig al primero.
7
C
Se trata de una lista con cabecera y centinela y las
referencias a dichos nodos nunca se modifican (aunque
pueda modificarse algún campo de los nodos), por lo que se
pueden utilizar como argumentos la cabecera y el centinela.
8
C
Se alcanza la condición de terminación “pesimista” cuando el
dato que se pretende insertar es superior al último. El
algoritmo no contempla tratamiento de inserción cuando
(lista.clave < dato) && (lista.sig == null).
Descargar