Skip to content

Commit 702ac74

Browse files
authored
Merge pull request mouredev#4186 from qwik-zgheib/main
#6-07 - go
2 parents fae89b9 + 2e63476 commit 702ac74

File tree

2 files changed

+233
-0
lines changed

2 files changed

+233
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package main
2+
3+
import "fmt"
4+
5+
/* example */
6+
type RecursivePrinter interface {
7+
PrintNumbers(n int)
8+
}
9+
10+
type NumberPrinter struct{}
11+
12+
func NewNumberPrinter() *NumberPrinter {
13+
return &NumberPrinter{}
14+
}
15+
16+
func (np *NumberPrinter) PrintNumbers(n int) {
17+
if n < 0 {
18+
return
19+
}
20+
fmt.Println(n)
21+
np.PrintNumbers(n - 1)
22+
}
23+
24+
/* extra - i */
25+
type FactorialCalculator interface {
26+
Factorial(n int) int
27+
}
28+
29+
type SimpleFactorialCalculator struct{}
30+
31+
func NewSimpleFactorialCalculator() *SimpleFactorialCalculator {
32+
return &SimpleFactorialCalculator{}
33+
}
34+
35+
func (fc *SimpleFactorialCalculator) Factorial(n int) int {
36+
if n <= 1 {
37+
return 1
38+
}
39+
return n * fc.Factorial(n-1)
40+
}
41+
42+
type SimpleFibonacciCalculator struct{}
43+
44+
/* extra - ii */
45+
type FibonacciCalculator interface {
46+
Fibonacci(n int) int
47+
}
48+
49+
func NewSimpleFibonacciCalculator() *SimpleFibonacciCalculator {
50+
return &SimpleFibonacciCalculator{}
51+
}
52+
53+
func (fc *SimpleFibonacciCalculator) Fibonacci(n int) int {
54+
if n <= 1 {
55+
return n
56+
}
57+
return fc.Fibonacci(n-1) + fc.Fibonacci(n-2)
58+
}
59+
60+
func main() {
61+
numberPrinter := NewNumberPrinter()
62+
factorialCalculator := NewSimpleFactorialCalculator()
63+
fibonacciCalculator := NewSimpleFibonacciCalculator()
64+
65+
fmt.Println("Printing numbers from 100 to 0:")
66+
numberPrinter.PrintNumbers(100)
67+
68+
fmt.Println("\nFactorial of 5:")
69+
fmt.Println(factorialCalculator.Factorial(5))
70+
71+
fmt.Println("\nFibonacci number at position 10:")
72+
fmt.Println(fibonacciCalculator.Fibonacci(10))
73+
}
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)