Skip to content

Commit

Permalink
Merge ba07bc2 into 27adc32
Browse files Browse the repository at this point in the history
  • Loading branch information
vaskoz committed Oct 13, 2018
2 parents 27adc32 + ba07bc2 commit b1b54aa
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,4 @@ problems from
* [Day 47](https://github.com/vaskoz/dailycodingproblem-go/issues/105)
* [Day 49](https://github.com/vaskoz/dailycodingproblem-go/issues/107)
* [Day 50](https://github.com/vaskoz/dailycodingproblem-go/issues/110)
* [Day 53](https://github.com/vaskoz/dailycodingproblem-go/issues/114)
65 changes: 65 additions & 0 deletions day53/problem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package day53

import "errors"

var errEmpty = errors.New("empty")

// ErrEmpty is the error returned for an empty data structure.
func ErrEmpty() error {
return errEmpty
}

// Stack represents a LIFO data structure.
type Stack interface {
Push(val interface{})
Pop() (interface{}, error)
}

// Queue represents a FIFO data structure.
type Queue interface {
Enqueue(item interface{})
Dequeue() (interface{}, error)
}

type stack struct {
values []interface{}
}

func (s *stack) Push(val interface{}) {
s.values = append(s.values, val)
}

func (s *stack) Pop() (interface{}, error) {
if len(s.values) == 0 {
return nil, ErrEmpty()
}
var x interface{}
x, s.values = s.values[len(s.values)-1], s.values[:len(s.values)-1]
return x, nil
}

type twoStacksQueue struct {
enqueue, dequeue *stack
}

func (tsq twoStacksQueue) Enqueue(item interface{}) {
tsq.enqueue.Push(item)
}

func (tsq twoStacksQueue) Dequeue() (interface{}, error) {
if val, err := tsq.dequeue.Pop(); err == nil {
return val, nil
}
for val, err := tsq.enqueue.Pop(); err == nil; val, err = tsq.enqueue.Pop() {
tsq.dequeue.Push(val)
}
if val, err := tsq.dequeue.Pop(); err == nil {
return val, nil
}
return nil, ErrEmpty()
}

// NewQueue returns a queue. FIFO.
func NewQueue() Queue {
return &twoStacksQueue{&stack{}, &stack{}}
}
32 changes: 32 additions & 0 deletions day53/problem_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package day53

import "testing"

var testcases = []struct {
inserts []interface{}
}{
{[]interface{}{"foo", "bar", 1, 3, 5, 6}},
}

func TestQueue(t *testing.T) {
t.Parallel()
for _, tc := range testcases {
q := NewQueue()
for _, v := range tc.inserts {
q.Enqueue(v)
}
for _, v := range tc.inserts {
if res, err := q.Dequeue(); err != nil {
t.Errorf("Expected no errors while dequeuing")
} else if res != v {
t.Errorf("Expected results in FIFO order. Expected %v, got %v", v, res)
}
}
if _, err := q.Dequeue(); err == nil {
t.Errorf("Dequeue on empty queue should return an error")
}
}
}

func BenchmarkQueue(b *testing.B) {
}

0 comments on commit b1b54aa

Please sign in to comment.