Ejercicios propuestos – propuestos – Pilas Pilas 1.
Multiplique los los elementos de una una pila por un valor. valor. Solo debe utilizar funciones de pilas (push y pop). Los elementos de la pila resultante deberán estar en el orden original.
void recorerPila(Nodo* lista) { Nodo* p = lista; while (p!=NULL) { cout<
info<sgte; } }
#include using namespace std; struct Nodo { int info; Nodo* sgte; };
int main() { Nodo* lista = NULL; ingresarDatos(lista); cout<<"-----PILA ORIGINAL-----\n"; ORIGINAL-----\n"; recorerPila(lista); multiplicarDatos(lista); cout<<"-----PILA MULTIPLICADA-----\n"; MULTIPLICADA-----\n"; recorerPila(lista); return 0; }
void push (Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } int pop(Nodo* &lista) { Nodo* temp = lista; int n; n = lista->info; lista = lista->sgte; delete temp; return n; } void ingresarDatos(Nodo* &lista) { int n, x; cout<<"Ingrese cantidad de datos: "; cin>>n; for (int i=0; i>x; push(lista, x); } } void multiplicarDatos(Nodo* &lista) { Nodo* listaTemp = NULL; int num, m; cout<<"Ingrese numero multiplicador: "; cin>>m; while (lista!=NULL) { num = pop(lista) * m; push(listaTemp,num); } while (listaTemp!=NULL) { num = pop(listaTemp); push(lista, num); } delete listaTemp; }
2.
Se tiene un archivo archivo de modo texto, texto, se pide mostrar mostrar cada línea empezando por la ultima. #include #include using namespace std; struct Nodo { string info; Nodo* sgte; }; void push (Nodo* &lista, string x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } string pop(Nodo* &lista) { string x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } void popearLista (Nodo* &lista) { string x; while (lista!=NULL) { x = pop(lista); cout<
1
int main() { Nodo* lista = NULL; string x; ifstream abrirArchivo("texto.txt",ios::in); while (getline(abrirArchivo,x)) { push(lista, x); } popearLista(lista); return 0; } 3.
Lea un archivo que contenga un programa en C/C++ y determine si los símbolos {}, () y [] están correctamente balanceados. Si no lo están muestre el error indicando el símbolo faltante. #include #include using namespace std; struct Nodo { char info; Nodo* sgte; }; void push (Nodo* &lista, char x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } char pop (Nodo* &lista) { char x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } void leerExpresion (char expresion[30], int &l) { cout<<"Ingrese expresion: "; cin.getline(expresion,30); l = strlen(expresion); } void evaluarSymbols (Nodo* &l1, Nodo* &l2, Nodo* &l3, char exp[30], int l) { int ll=0, par=0, cor=0; for (int i=0; i
if (exp[i]== '}') { if (l1!=NULL) { pop(l1); } else { ll = ll+1; } } } if (exp[i] == '(') { push(l2, exp[i]); } else { if (exp[i]== ')') { if (l2!=NULL) { pop(l2); } else { par = par+1; } } } if (exp[i] == '[') { push(l3, exp[i]); } else { if (exp[i]== ']') { if (l3!=NULL) { pop(l3); } else { cor = cor+1; } } } } if (l1==NULL && l2==NULL && l3==NULL && ll==0 && par==0 && cor==0) { cout<<"La expresion esta correctamente balanceada."; } else { if (l1!=NULL || ll>0) { cout<<"Falta(n) llave(s)."<0) { cout<<"Falta(n) parentesis."<0) {
2
cout<<"Falta(n) corchete(s)."<
while (p!=NULL && dividir==false) { if (x == p->sgte->info) { dividir = true; lista2 = p->sgte; p->sgte = NULL; } }
} } } int main() { Nodo* l1 = NULL; //Pila para las {} Nodo* l2 = NULL; // Pila para los () Nodo* l3 = NULL; // Pila para los [] char expresion[30]; int lon; leerExpresion(expresion, lon); evaluarSymbols(l1, l2, l3, expresion, lon); return 0; } 4.
} void mostrarPila (Nodo* &lista) { int x; while(lista!=NULL) { x = pop(lista); cout<
Divida una pila en 2 a partir de un valor determinado. #include using namespace std;
int main() { Nodo* lista = NULL; Nodo* lista2 = NULL; ingresarDatos(lista); dividirPila(lista,lista2); cout<<"----PILA 1----\n"; mostrarPila(lista); cout<<"----PILA 2----\n"; mostrarPila(lista2); return 0; }
struct Nodo { int info; Nodo* sgte; }; void push (Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } int pop (Nodo* &lista) { int x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } void ingresarDatos(Nodo* &lista) { int n, x; cout<<"Ingrese cantidad de datos: "; cin>>n; for (int i=0; i>x; push(lista, x); } } void dividirPila(Nodo* lista, Nodo* &lista2) { bool dividir = false; Nodo* p = lista; int x; cout<<"Ingrese dato en el iniciara la di vision: "; cin>>x;
5.
Un disc jockey selecciona de una lista un conjunto de canciones, luego coloca los CDS uno encima de otro según el orden que serán tocados, una vez tocados los coloca uno encima del otro conforme los toca, al final de su turno los vuelve a colocar en el estante de cd. Haga un programa para esta situación. #include using namespace std; struct Nodo { int info; Nodo* ante; Nodo* sgte; }; void addAlFinal (Nodo* &primero, Nodo* &ultimo, int x) { Nodo* nuevo = new Nodo; Nodo* p = primero; nuevo->info = x; nuevo->sgte = NULL; ultimo = nuevo; if (primero==NULL) { primero = nuevo; nuevo->ante = NULL; } else { while(p->sgte!=NULL)
3
{
{ p = p->sgte;
push(pilaPorTocar,x);
} nuevo->ante = p; p->sgte = nuevo;
if (p->ante==NULL && p->sgte==NULL) { primero = NULL; ultimo = NULL; } else { if (p->ante == NULL) { primero = p->sgte; p->sgte->ante = p->ante; } else { if (p->sgte == NULL) { ultimo = p->ante; p->ante->sgte = NULL; } else { p->ante->sgte = p->sgte; p->sgte->ante = p->ante; } } }
} } void push (Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } int pop (Nodo* &lista) { int x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } void ingresarDatos (Nodo* &primero, Nodo* &ultimo) { int n; cout<<"Ingrese cantidad de CD's: "; cin>>n; for (int i=0; iinfo<sgte; } } void cdsATocar (Nodo* &primero, Nodo* &ultimo, Nodo* &pilaPorTocar) { int n, x; Nodo* p; Nodo* temp; cout<<"Ingrese cantidad de CDs a elegir: "; cin>>n; for (int i=0; i>x; p = primero; while (p!=NULL) { if (p->info == x)
} p = p->sgte; } } } void cdsTocados (Nodo* &pilaPorTocar, &pilaTocados) { int x; while (pilaPorTocar!=NULL) { x = pop(pilaPorTocar); push(pilaTocados,x); } }
Nodo*
void regresarCDs(Nodo* &primero, Nodo* &ultimo, Nodo* &pilaTocados) { int x; Nodo* p = primero; while (pilaTocados!=NULL) { x = pop(pilaTocados); addAlFinal(primero,ultimo,x); } } int main() { Nodo* primero = NULL; Nodo* ultimo = NULL; Nodo* pilaPorTocar = NULL; Nodo* pilaTocados = NULL; ingresarDatos(primero,ultimo); cout<<"----ESTANTE DE CD'S----\n"; mostrarDatos(primero);
4
cdsATocar(primero,ultimo,pilaPorTocar); cout<<"========== DESPUES DE ELEGIR ========\n"; cout<<"---ESTANTE DE CD'S---\n"; mostrarDatos(primero); cout<<"---PILA DE CD'S POR TOCAR---\n"; mostrarDatos(pilaPorTocar); cout<<"---PILA DE CD'S TOCADOS---\n"; mostrarDatos(pilaTocados); cout<<"========== DESPUES DE TOCAR =========\n"; cdsTocados(pilaPorTocar,pilaTocados); cout<<"---ESTANTE DE CD'S---\n"; mostrarDatos(primero); cout<<"---PILA DE CD'S POR TOCAR---\n"; mostrarDatos(pilaPorTocar); cout<<"---PILA DE CD'S TOCADOS---\n"; mostrarDatos(pilaTocados); cout<<"==== SE REGRESAN LOS CDs AL ESTANTE====\n"; regresarCDs(primero,ultimo,pilaTocados); cout<<"---ESTANTE DE CD'S---\n"; mostrarDatos(primero); cout<<"---PILA DE CD'S POR TOCAR---\n"; mostrarDatos(pilaPorTocar); cout<<"---PILA DE CD'S TOCADOS---\n"; mostrarDatos(pilaTocados); return 0; } 6.
for (int i=0; i>x; push(lista, x); } } void reemplazarElemento(Nodo* lista) { int rd, nd, x; Nodo* temp = NULL; cout<<"Ingrese dato a reemplazar: "; cin>>rd; cout<<"Ingrese nuevo dato: "; cin>>nd; while (lista->info!=rd) { x = pop(lista); push(temp,x); } lista->info = nd; while (temp!=NULL) { x = pop(temp); push(lista, x); } delete temp; }
Reemplace un elemento de una pila por otro. Recuerde que acceder a un elemento de la pila elimina su elemento. Sugerencia: use una pila au xiliar.
void mostrarDatos (Nodo* lista) { Nodo* p = lista; if (p==NULL) { cout<<"No hay datos\n"; } while (p!=NULL) { cout<info<sgte; } }
#include using namespace std; struct Nodo { int info; Nodo* sgte; }; void push(Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } int pop (Nodo* &lista) { int x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } void ingresarDatos(Nodo* &lista) { int n, x; cout<<"Ingrese cantidad de datos: "; cin>>n;
int main() { Nodo* lista = NULL; ingresarDatos(lista); cout<<"--Pila Inicial--\n"; mostrarDatos(lista); reemplazarElemento(lista); cout<<"--Nueva Pila--\n"; mostrarDatos(lista); return 0; } 7.
Ingrese un número al revés y luego pruebe su memoria ingresándolo nuevamente, pero con sus cifras invertidas. Usando pilas, diga cuantos errores cometió al ingresar el número invertido. Por ejemplo, si el número fue 12345 y usted ingreso 54221, entonces cometió un error. #include using namespace std;
5
struct Nodo { int info; Nodo* sgte; };
n = n/10; } else { c = c+1; noError = noError*false; cout<<"Usted ha fallado.\n"; } push(temp,x);
void push(Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; }
} if (noError == true) { cout<<"Usted ha ingresado el correcto.\n"; cout<<"Cometio "<
int pop (Nodo* &lista) { int x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } void ingresarNumero(Nodo* &lista) { int n; cout<<"Ingrese numero: "; cin>>n; while (n>0) { push(lista,n%10); n = n/10; } }
int main() { Nodo* lista = NULL; ingresarNumero(lista); mostrarDatos(lista); compararNumero(lista); return 0; } 8.
void mostrarDatos (Nodo* lista) { Nodo* p = lista; if (p==NULL) { cout<<"No hay datos\n"; } while (p!=NULL) { cout<info<sgte; } } void compararNumero (Nodo* &lista) { bool correcto = false; bool noError; int n, x, c = 0; Nodo* temp; while (correcto == false) { temp = NULL; noError = true; cout<<"Ingrese numero al revez: "; cin>>n; while (lista!=NULL && noError==true) { x = pop(lista); if (n%10 == x) {
numero
Determine si dos pilas son iguales. Recuerde que acceder a un elemento de la pila elimina su elemento. Sugerencia: use pilas auxiliares #include using namespace std; struct Nodo { int info; Nodo* sgte; }; void push (Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } int pop (Nodo* &lista) { int x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; }
6
void ingresarDatos (Nodo* &lista, int n) { int x; for (int i=0; i>x; push(lista,x); } } void compararDatos (Nodo* &lista1, Nodo* &lista2) { int x1, x2; bool igualdad = true; Nodo* temp1 = NULL; Nodo* temp2 = NULL; while (lista1!=NULL && lista2!=NULL && igualdad==true) { x1 = pop(lista1); x2 = pop(lista2); if (x1 != x2) { igualdad = false; } push(temp1,x1); push(temp2,x2); } while (temp1!=NULL && temp2!=NULL) { x1 = pop(temp1); x2 = pop(temp2); push(lista1,x1); push(lista2,x2); } if (igualdad == true) { cout<<"Ambas pilas son iguales."; } else { cout<<"Las pilas son diferentes."; } }
int main() { int n; Nodo* lista1 = NULL; Nodo* lista2 = NULL; cout<<"Ingrese cantidad de datos: "; cin>>n; cout<<"---Pila 1---\n"; ingresarDatos(lista1, n); cout<<"---Pila 2---\n"; ingresarDatos(lista2, n); compararDatos(lista1,lista2); return 0; } 9.
Calcular el número de elementos de una pila sin modificar su contenido. Recuerde que acceder a un elemento de la pila elimina su elemento. Sugerencia: use dos pilas.
#include using namespace std; struct Nodo { int info; Nodo* sgte; }; void push (Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } int pop (Nodo* &lista) { int x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } void ingresarDatos (Nodo* &lista) { int n, x; cout<<"Ingrese cantidad de datos: "; cin>>n; for (int i=0; i>x; push(lista, x); } } void calcularNElementos(Nodo* &lista) { int x, c = 0; Nodo* temp = NULL; while (lista!=NULL) { x = pop(lista); push(temp, x); c = c+1; } cout<<"El numero de elementos es: "<
7
} while (temp!=NULL) { x = pop(temp); push(lista, x); } if (encontrado == false) { cout<<"No se encontro el dato a eliminar.\n"; } else { cout<<"Se elimino el dato.\n"; }
10. Elimine un elemento de una Pila. Use pilas auxiliares. #include using namespace std; struct Nodo { int info; Nodo* sgte; }; void push (Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } int pop (Nodo* &lista) { int x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } void ingresarDatos (Nodo* &lista) { int n, x; cout<<"Ingrese cantidad de datos: "; cin>>n; for (int i=0; i>x; push(lista, x); } } void eliminarDato (Nodo* &lista) { int e, x; Nodo* temp = NULL; bool encontrado = false; cout<<"Ingrese dato a eliminar: "; cin>>e; while (lista!=NULL && encontrado==false) { x = pop(lista); if (x==e) { encontrado = true; while (temp!=NULL) { x = pop(temp); push(lista, x); } } else { push(temp,x); }
} void recorerPila (Nodo* lista) { Nodo* p = lista; while (p!=NULL) { cout<info<sgte; } } int main() { Nodo* lista = NULL; ingresarDatos(lista); eliminarDato(lista); recorerPila(lista); return 0; } 11. Realizar un procedimiento que ingrese un elemento en la posición N de una pila. Tener en cuenta que los demás elementos deben quedar en el mismo orden. #include using namespace std; struct Nodo { int info; Nodo* sgte; }; void push (Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } int pop (Nodo* &lista) { int x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; }
8
void ingresarDatos (Nodo* &lista) { int n, x; cout<<"Ingrese cantidad de datos: "; cin>>n; for (int i=0; i>x; push(lista, x); } } void agregarDato(Nodo* &lista) { Nodo* temp = NULL; int x, n, a; int i=0; cout<<"Ingrese nuevo dato: "; cin>>x; cout<<"Ingrese posicion del nuevo dato: "; cin>>n; while (i
Nodo* sgte; }; void push (Nodo* &lista, int x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; } int pop (Nodo* &lista) { int x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } void ingresarDatos (Nodo* &lista, char x[50]) { int i=0; cout<<"Ingrese cadena de caracteres: "; cin.getline(x, 50); while (x[i]!='\0') { push(lista,x[i]); i = i+1; } }
void recorrerPila (Nodo* lista) { Nodo* p = lista; while (p!=NULL) { cout<info<sgte; } }
void voltearCadena (Nodo* &lista, char y[50]) { char x; int i = 0; while (lista!=NULL) { x = pop(lista); y[i] = x; i = i+1; } y[i] = '\0'; }
int main() { Nodo* lista = NULL; ingresarDatos(lista); cout<<"---PILA INGRESADA---\n"; recorrerPila(lista); agregarDato(lista); cout<<"---PILA MODIFICADA---\n"; recorrerPila(lista); return 0; }
int main() { char x[50]; char y[50]; Nodo* lista = NULL; ingresarDatos(lista, x); cout<<"\nCadena 1: "<
12. Usando una pila invierta una cadena. #include using namespace std; struct Nodo { char info;
13. Leer una frase y luego invierta el orden de las palabras en la frase. Por Ejemplo: “una imagen vale por mil palabras” debe convertirse en “palabras mil por vale imagen una”. #include #include #include
9
#include
struct Nodo { string info; Nodo* sgte; };
void recorerPila (Nodo* lista) { string x; while (lista!=NULL) { x = pop(lista); cout<
void push (Nodo* &lista, string x) { Nodo* nuevo = new Nodo; nuevo->info = x; nuevo->sgte = lista; lista = nuevo; }
int main() { Nodo* lista = NULL; ingresarDatos(lista); recorerPila(lista); return 0; }
using namespace std;
string pop(Nodo* &lista) { string x; Nodo* temp = lista; x = lista->info; lista = lista->sgte; delete temp; return x; } vector spliter(string &str, int &c, char separador) { vector resultado; size_t pos1 = 0; size_t pos2 = 0; while (pos2 != str.npos) { pos2 = str.find(separador, pos1); if (pos2 != str.npos) { if (pos2 > pos1) { resultado.push_back(str.substr(pos1,pos2pos1)); } pos1 = pos2+1; } c = c+1; } resultado.push_back(str.substr(pos1, str.size()pos1)); return resultado; }
14. Simular la operación de n pilas operando simultáneamente y donde se saca y/o inserta elementos al azar a cualquiera de las pilas. Determine cuál es la pila de mayor trabajo y cual es la pila de menos trabajo en un tiempo determinado de operación.
15. Se tienen dos pilas (stacks) que contienen números enteros; la primera ordenada ascendentemente desde el tope hacia el fondo, y la segunda ordenada descendentemente desde el tope hacia el fondo. Elabore un programa que fusione ambas pilas en una tercera ordenada descendentemente desde el tope hacia el fondo. NOTA: no debe utilizar pilas auxiliares.
void ingresarDatos(Nodo* &lista) { string x; vector palabras; int i = 0, c = 0; cout<<"Ingrese cadena de palabras: "; getline(cin,x); palabras = spliter(x,c,' '); for (i=0; i
10