Skip to content

Commit 2220d7b

Browse files
committed
Material capítulo 2 completo, incluyendo slides
1 parent 3f814c4 commit 2220d7b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+3110
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"metadata": {},
6+
"source": [
7+
"<p>\n",
8+
"<font size='5' face='Georgia, Arial'>IIC2115 - Programación como herramienta para la ingeniería</font><br>\n",
9+
"<font size='1'>Basado en material de Karim Pichara y Christian Pieringer. Todos los derechos reservados.</font>\n",
10+
"</p>"
11+
]
12+
},
13+
{
14+
"cell_type": "markdown",
15+
"metadata": {},
16+
"source": [
17+
"## Stacks"
18+
]
19+
},
20+
{
21+
"cell_type": "markdown",
22+
"metadata": {},
23+
"source": [
24+
"Los _stacks_ son una estructura de datos en donde una colección de objetos son insertados y removidos según el principio de __Last In__, __First Out___ (LIFO). Es decir, un usuario puede agregar secuencialmente objetos al stack en cualquier momento, sin embargo, solo puede remover desde el stack el objeto __más recientemente agregado__ (ubicado en el tope del _stack_). Cómo se muestra en la siguiente figura, el funcionamiento de los stacks es equivalente al de una columna de platos apilados después de ser lavados. El último plato lavado lavado será el primero en ser utilizado.\n",
25+
"\n",
26+
"![](figs/stacks.png)"
27+
]
28+
},
29+
{
30+
"cell_type": "markdown",
31+
"metadata": {},
32+
"source": [
33+
"En general, los stacks tienen los siguientes métodos: `push()`, `pop()`, `top()`, `is_empty()`, `len()`. Dentro de los métodos más usados se encuentran: `push()` para insertar un objeto al tope del stack; y `pop()` para remover el último objeto insertado en él. En Python, los stacks están implementados mediante listas. A continuación vemos los métodos para stacks equivalentes con la implementación usando listas.\n",
34+
"\n",
35+
"![](figs/stacks-methods.png)"
36+
]
37+
},
38+
{
39+
"cell_type": "markdown",
40+
"metadata": {},
41+
"source": [
42+
"Estos métodos funcionan de la siguiente manera:"
43+
]
44+
},
45+
{
46+
"cell_type": "code",
47+
"execution_count": null,
48+
"metadata": {},
49+
"outputs": [],
50+
"source": [
51+
"# un stack vacio\n",
52+
"stack = []\n",
53+
"\n",
54+
"# push\n",
55+
"stack.append(1)\n",
56+
"stack.append(10)\n",
57+
"stack.append(12)\n",
58+
"\n",
59+
"print(stack)\n",
60+
"\n",
61+
"# pop\n",
62+
"stack.pop() \n",
63+
"print('pop: {0}'.format(stack))\n",
64+
"\n",
65+
"# top\n",
66+
"stack.append(25)\n",
67+
"print('top: {0}'.format(stack[-1]))\n",
68+
"\n",
69+
"# len\n",
70+
"print('el stack tiene {0} elementos'.format(len(stack)))\n",
71+
"\n",
72+
"# is_empty\n",
73+
"stack = []\n",
74+
"if len(stack) == 0:\n",
75+
" print('el stack está vacío')"
76+
]
77+
},
78+
{
79+
"cell_type": "markdown",
80+
"metadata": {},
81+
"source": [
82+
"Un ejemplo real del uso de stacks en una aplicación es el botón *back* en los navegadores de internet. Durante la navegación, todas las direcciones van siendo ingresadas en un stack. La última dirección siempre es recuperada al presionar este botón.\n",
83+
"\n",
84+
"![](figs/back-button-stacks.png)"
85+
]
86+
},
87+
{
88+
"cell_type": "code",
89+
"execution_count": null,
90+
"metadata": {},
91+
"outputs": [],
92+
"source": [
93+
"class Navegador:\n",
94+
" \n",
95+
" def __init__(self, current_url = 'http://www.google.com'):\n",
96+
" self.__urls_stack = []\n",
97+
" self.__current_url = current_url\n",
98+
" \n",
99+
" def __cargar_url(self, url):\n",
100+
" self.__current_url = url\n",
101+
" print('cargando url: {0}'.format(url))\n",
102+
" \n",
103+
" def ir(self, url):\n",
104+
" self.__urls_stack.append(self.__current_url)\n",
105+
" print('ir ->', end=' ')\n",
106+
" self.__cargar_url(url) \n",
107+
" \n",
108+
" def volver(self):\n",
109+
" last_url = self.__urls_stack.pop() \n",
110+
" print('back->', end=' ')\n",
111+
" self.__cargar_url(last_url)\n",
112+
" \n",
113+
" def mostrar_pagina_actual(self):\n",
114+
" print('pagina actual: {0}'.format(self.__current_url))\n",
115+
" \n",
116+
" \n",
117+
"Chrome = Navegador()\n",
118+
"Chrome.ir('http://www.uc.cl')\n",
119+
"Chrome.ir('http://www.uc.cl/es/programas-de-estudio')\n",
120+
"Chrome.ir('http://www.uc.cl/es/doctorado')\n",
121+
"\n",
122+
"Chrome.mostrar_pagina_actual()\n",
123+
"Chrome.volver()\n",
124+
"Chrome.mostrar_pagina_actual()"
125+
]
126+
},
127+
{
128+
"cell_type": "markdown",
129+
"metadata": {},
130+
"source": [
131+
"Otro ejemplo para el uso de stacks es revertir secuencias. A continuación una implementación sencilla de este ejemplo."
132+
]
133+
},
134+
{
135+
"cell_type": "code",
136+
"execution_count": null,
137+
"metadata": {},
138+
"outputs": [],
139+
"source": [
140+
"class Texto:\n",
141+
" \n",
142+
" def __init__(self):\n",
143+
" self.stack = []\n",
144+
"\n",
145+
" def leer_archivo(self, nombre_archivo):\n",
146+
" print('Entrada:')\n",
147+
" \n",
148+
" with open(nombre_archivo) as fid:\n",
149+
" for linea in fid:\n",
150+
" print(linea.strip())\n",
151+
" self.stack.append(linea.strip())\n",
152+
" \n",
153+
" print()\n",
154+
" fid.closed\n",
155+
"\n",
156+
" def invertir_lines(self):\n",
157+
" print('Salida:')\n",
158+
" \n",
159+
" while len(self.stack) > 0:\n",
160+
" print(self.stack.pop())\n",
161+
" \n",
162+
"\n",
163+
"t = Texto()\n",
164+
"t.leer_archivo('stacks-texto.txt')\n",
165+
"t.invertir_lines()"
166+
]
167+
}
168+
],
169+
"metadata": {
170+
"anaconda-cloud": {},
171+
"kernelspec": {
172+
"display_name": "Python 3",
173+
"language": "python",
174+
"name": "python3"
175+
},
176+
"language_info": {
177+
"codemirror_mode": {
178+
"name": "ipython",
179+
"version": 3
180+
},
181+
"file_extension": ".py",
182+
"mimetype": "text/x-python",
183+
"name": "python",
184+
"nbconvert_exporter": "python",
185+
"pygments_lexer": "ipython3",
186+
"version": "3.7.3"
187+
}
188+
},
189+
"nbformat": 4,
190+
"nbformat_minor": 1
191+
}

0 commit comments

Comments
 (0)