package main
import (
"fmt"
)
type Stack struct {
items []int
}
func (s *Stack) Push(val int) {
s.items = append(s.items, val) // add to top
}
func (s *Stack) Pop() (int, bool) {
if len(s.items) == 0 {
return 0, false // empty stack
}
val := s.items[len(s.items)-1] // get top
s.items = s.items[:len(s.items)-1] // remove top
return val, true
}
type Queue struct {
items []int
}
func (q *Queue) Enqueue(val int) {
q.items = append(q.items, val) // add to back
}
func (q *Queue) Dequeue() (int, bool) {
if len(q.items) == 0 {
return 0, false // empty queue
}
val := q.items[0] // get front
q.items = q.items[1:] // remove front
return val, true
}
func main() {
// Stack example
stack := Stack{}
stack.Push(1)
stack.Push(2)
stack.Push(3)
popVal, _ := stack.Pop()
fmt.Printf("Stack after pushes and one pop: %v (popped %d)\n", stack.items, popVal)
// Queue example
queue := Queue{}
queue.Enqueue(1)
queue.Enqueue(2)
queue.Enqueue(3)
deqVal, _ := queue.Dequeue()
fmt.Printf("Queue after enqueues and one dequeue: %v (dequeued %d)\n", queue.items, deqVal)
}
s.items = append(s.items, val) // add to top
push new item on top of stack
val := s.items[len(s.items)-1] // get top
s.items = s.items[:len(s.items)-1] // remove top
pop top item from stack
q.items = append(q.items, val) // add to back
enqueue new item at back of queue
val := q.items[0] // get front
q.items = q.items[1:] // remove front
dequeue front item from queue
Stack after pushes and one pop: [1 2] (popped 3)
Queue after enqueues and one dequeue: [2 3] (dequeued 1)