Skip to content

Commit 2e63476

Browse files
author
qwik-zgheib
committed
feat: reto #7 - go
1 parent f8cbec3 commit 2e63476

File tree

1 file changed

+160
-0
lines changed

1 file changed

+160
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
// Stack defines the interface for a LIFO stack.
8+
type Stack interface {
9+
Push(item string)
10+
Pop() (string, error)
11+
Print()
12+
}
13+
14+
// Queue defines the interface for a FIFO queue.
15+
type Queue interface {
16+
Enqueue(item string)
17+
Dequeue() (string, error)
18+
Print()
19+
}
20+
21+
type StringStack struct {
22+
items []string
23+
}
24+
25+
func NewStringStack() *StringStack {
26+
return &StringStack{items: []string{}}
27+
}
28+
29+
func (s *StringStack) Push(item string) {
30+
s.items = append(s.items, item)
31+
}
32+
33+
func (s *StringStack) Pop() (string, error) {
34+
if len(s.items) == 0 {
35+
return "", fmt.Errorf("stack is empty")
36+
}
37+
item := s.items[len(s.items)-1]
38+
s.items = s.items[:len(s.items)-1]
39+
return item, nil
40+
}
41+
42+
func (s *StringStack) Print() {
43+
fmt.Println(s.items)
44+
}
45+
46+
type StringQueue struct {
47+
items []string
48+
}
49+
50+
func NewStringQueue() *StringQueue {
51+
return &StringQueue{items: []string{}}
52+
}
53+
54+
func (q *StringQueue) Enqueue(item string) {
55+
q.items = append(q.items, item)
56+
}
57+
58+
func (q *StringQueue) Dequeue() (string, error) {
59+
if len(q.items) == 0 {
60+
return "", fmt.Errorf("queue is empty")
61+
}
62+
item := q.items[0]
63+
q.items = q.items[1:]
64+
return item, nil
65+
}
66+
67+
func (q *StringQueue) Print() {
68+
fmt.Println(q.items)
69+
}
70+
71+
type WebNavigator struct {
72+
stack Stack
73+
}
74+
75+
func NewWebNavigator(stack Stack) *WebNavigator {
76+
return &WebNavigator{stack: stack}
77+
}
78+
79+
func (wn *WebNavigator) Navigate() {
80+
for {
81+
var action string
82+
fmt.Println("Enter a URL or type 'forward', 'back', or 'exit':")
83+
fmt.Scan(&action)
84+
switch action {
85+
case "exit":
86+
fmt.Println("Exiting web navigator.")
87+
return
88+
case "forward":
89+
fmt.Println("Forwarding to next page.")
90+
_, err := wn.stack.Pop()
91+
if err != nil {
92+
fmt.Println("No next pages.")
93+
}
94+
case "back":
95+
_, err := wn.stack.Pop()
96+
if err != nil {
97+
fmt.Println("No previous pages.")
98+
}
99+
default:
100+
wn.stack.Push(action)
101+
}
102+
wn.stack.Print()
103+
}
104+
}
105+
106+
type SharedPrinter struct {
107+
queue Queue
108+
}
109+
110+
func NewSharedPrinter(queue Queue) *SharedPrinter {
111+
return &SharedPrinter{queue: queue}
112+
}
113+
114+
func (sp *SharedPrinter) PrintDocuments() {
115+
for {
116+
var action string
117+
fmt.Println("Add a document or type 'print' or 'exit':")
118+
fmt.Scan(&action)
119+
switch action {
120+
case "exit":
121+
return
122+
case "print":
123+
doc, err := sp.queue.Dequeue()
124+
if err != nil {
125+
fmt.Println("No documents to print.")
126+
} else {
127+
fmt.Printf("Printing: %s\n", doc)
128+
}
129+
default:
130+
sp.queue.Enqueue(action)
131+
}
132+
sp.queue.Print()
133+
}
134+
}
135+
136+
func main() {
137+
stack := NewStringStack()
138+
stack.Push("1")
139+
stack.Push("2")
140+
stack.Push("3")
141+
stack.Print()
142+
item, _ := stack.Pop()
143+
fmt.Println("Popped item:", item)
144+
stack.Print()
145+
146+
queue := NewStringQueue()
147+
queue.Enqueue("1")
148+
queue.Enqueue("2")
149+
queue.Enqueue("3")
150+
queue.Print()
151+
item, _ = queue.Dequeue()
152+
fmt.Println("Dequeued item:", item)
153+
queue.Print()
154+
155+
webNavigator := NewWebNavigator(NewStringStack())
156+
webNavigator.Navigate()
157+
158+
sharedPrinter := NewSharedPrinter(NewStringQueue())
159+
sharedPrinter.PrintDocuments()
160+
}

0 commit comments

Comments
 (0)