1+ /*
2+ * EJERCICIO:
3+ * Implementa los mecanismos de introducción y recuperación de elementos propios de las
4+ * pilas (stacks - LIFO) y las colas (queue - FIFO) utilizando una estructura de array
5+ * o lista (dependiendo de las posibilidades de tu lenguaje).
6+ *
7+ * DIFICULTAD EXTRA (opcional):
8+ * - Utilizando la implementación de pila y cadenas de texto, simula el mecanismo adelante/atrás
9+ * de un navegador web. Crea un programa en el que puedas navegar a una página o indicarle
10+ * que te quieres desplazar adelante o atrás, mostrando en cada caso el nombre de la web.
11+ * Las palabras "adelante", "atrás" desencadenan esta acción, el resto se interpreta como
12+ * el nombre de una nueva web.
13+ * - Utilizando la implementación de cola y cadenas de texto, simula el mecanismo de una
14+ * impresora compartida que recibe documentos y los imprime cuando así se le indica.
15+ * La palabra "imprimir" imprime un elemento de la cola, el resto de palabras se
16+ * interpretan como nombres de documentos.
17+ */
18+
19+ console . log ( '---------------------PILA---------------------' ) ;
20+
21+ class Stack {
22+
23+ constructor ( arr ) {
24+ this . stack = arr ;
25+ }
26+
27+ push ( item ) {
28+ this . stack . push ( item ) ;
29+ }
30+
31+ pop ( ) {
32+ this . stack . pop ( ) ;
33+ }
34+
35+ peek ( ) {
36+ return this . stack [ this . stack . length - 1 ] ;
37+ }
38+
39+ size ( ) {
40+ return this . stack . length ;
41+ }
42+ }
43+
44+ const pila = new Stack ( [ 10 , 20 , 30 ] ) ;
45+
46+ pila . push ( 40 ) ;
47+ pila . push ( 50 ) ;
48+ pila . pop ( ) ;
49+
50+ console . log ( pila . peek ( ) ) ;
51+ console . log ( pila . size ( ) ) ;
52+
53+
54+ console . log ( '---------------------COLA---------------------' ) ;
55+
56+ class Queue {
57+
58+ constructor ( arr ) {
59+ this . queue = arr ;
60+ }
61+
62+ enqueue ( item ) {
63+ this . queue . push ( item ) ;
64+ }
65+
66+ dequeue ( ) {
67+ if ( this . isEmpty ( ) ) {
68+ return null ;
69+ } else {
70+ return this . queue . shift ( ) ;
71+ }
72+ }
73+
74+ isEmpty ( ) {
75+ return this . queue . length === 0 ;
76+ }
77+
78+ size ( ) {
79+ return this . queue . length ;
80+ }
81+
82+ front ( ) {
83+ if ( this . isEmpty ( ) ) {
84+ return null ;
85+ } else {
86+ return this . queue [ 0 ] ;
87+ }
88+ }
89+ }
90+
91+ const cola = new Queue ( [ 11 , 22 , 33 ] ) ;
92+ console . log ( cola ) ;
93+ cola . dequeue ( ) ;
94+ cola . enqueue ( 1 ) ;
95+ console . log ( cola . front ( ) ) ;
96+
97+ console . log ( '-------------- NAVEGADOR WEB --------------' ) ;
98+
99+ const readline = require ( 'readline' ) ;
100+ const rl = readline . createInterface ( process . stdin , process . stdout ) ;
101+
102+ let historial = new Stack ( [ ] ) ;
103+ let forwardStack = new Stack ( [ ] ) ;
104+
105+ const navegador = ( ) => {
106+
107+ rl . question ( 'Adelante, atrás, o introduce una web -> ' , ( term ) => {
108+ switch ( term ) {
109+ case 'adelante' :
110+ goForward ( ) ;
111+ break ;
112+ case 'atras' :
113+ goBack ( ) ;
114+ break ;
115+ default :
116+ navigate ( term ) ;
117+ }
118+ } ) ;
119+
120+ }
121+
122+ const navigate = ( term ) => {
123+ historial . push ( term ) ;
124+ console . log ( 'Going to -> ' , term ) ;
125+ forwardStack = new Stack ( [ ] ) ;
126+ entryPoint ( ) ;
127+ }
128+
129+ const goBack = ( ) => {
130+ forwardStack . push ( historial . peek ( ) )
131+ historial . pop ( ) ;
132+ console . log ( 'Going back to -> ' , historial . peek ( ) ) ;
133+ entryPoint ( ) ;
134+ }
135+
136+ const goForward = ( ) => {
137+ console . log ( 'Going forward to ->' , forwardStack . peek ( ) ) ;
138+ historial . push ( forwardStack . peek ( ) ) ;
139+ entryPoint ( ) ;
140+ }
141+
142+ // * DIFICULTAD EXTRA (opcional):
143+ // * - Utilizando la implementación de cola y cadenas de texto, simula el mecanismo de una
144+ // * impresora compartida que recibe documentos y los imprime cuando así se le indica.
145+ // * La palabra "imprimir" imprime un elemento de la cola, el resto de palabras se
146+ // * interpretan como nombres de documentos.
147+
148+ console . log ( '-------------- IMPRESORA --------------' ) ;
149+
150+ let colaImpresion = new Queue ( [ ] ) ;
151+
152+ const imprimir = ( ) => {
153+
154+ rl . question ( 'Imprime o añade un documento -> ' , ( term ) => {
155+
156+ switch ( term ) {
157+ case 'imprimir' :
158+ console . log ( 'Imprimiendo documento: ' , colaImpresion . dequeue ( ) ) ;
159+ imprimir ( ) ;
160+ break ;
161+ default :
162+ console . log ( 'Documento añadido: ' , term ) ;
163+ colaImpresion . enqueue ( term ) ;
164+ imprimir ( ) ;
165+ break ;
166+ }
167+ } )
168+ }
169+
170+ const entryPoint = ( ) => {
171+
172+ rl . question ( '¿Qué programa desea ejecutar? -> ' , ( term ) => {
173+ switch ( term ) {
174+ case 'Navegador' :
175+ navegador ( ) ;
176+ break ;
177+ case 'Impresora' :
178+ imprimir ( ) ;
179+ break ;
180+ }
181+ } )
182+ }
183+
184+ entryPoint ( ) ;
0 commit comments