From f824788c590e18f0d01b27330e4f503d2c0e62a9 Mon Sep 17 00:00:00 2001 From: Evan Burkey Date: Thu, 6 Jul 2023 14:40:52 -0700 Subject: [PATCH] init --- .gitignore | 1 + LICENSE | 13 ++++++++++ README.md | 3 +++ go.mod | 12 +++++++++ go.sum | 18 +++++++++++++ stack.go | 48 ++++++++++++++++++++++++++++++++++ stack_test.go | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 166 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 go.mod create mode 100644 go.sum create mode 100644 stack.go create mode 100644 stack_test.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7ebe3ea --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2023 Evan Burkey + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3e7edd4 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# stack + +A super simple stack implementation using generics \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..757f718 --- /dev/null +++ b/go.mod @@ -0,0 +1,12 @@ +module stack + +go 1.20 + +require github.com/stretchr/testify v1.8.4 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.5.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..673e918 --- /dev/null +++ b/go.sum @@ -0,0 +1,18 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/stack.go b/stack.go new file mode 100644 index 0000000..d8acf70 --- /dev/null +++ b/stack.go @@ -0,0 +1,48 @@ +package stack + +import "fmt" + +type Stack[T any] struct { + arr []T + size int +} + +func NewStack[T any]() *Stack[T] { + return &Stack[T]{ + arr: make([]T, 0), + size: 0, + } +} + +func (s *Stack[T]) Clear() { + s.arr = make([]T, 0) + s.size = 0 +} + +func (s *Stack[T]) Size() int { + return s.size +} + +func (s *Stack[T]) Pop() (*T, error) { + if s.size == 0 { + return nil, fmt.Errorf("tried to pop empty stack") + } + t := s.arr[s.size-1] + s.arr = s.arr[:s.size-1] + s.size-- + return &t, nil +} + +func (s *Stack[T]) Push(t T) { + s.arr = append(s.arr, t) + s.size++ +} + +func (s *Stack[T]) Peek() T { + t := s.arr[s.size-1] + return t +} + +func (s *Stack[T]) PeekPtr() *T { + return &(s.arr[s.size-1]) +} diff --git a/stack_test.go b/stack_test.go new file mode 100644 index 0000000..b8b91a8 --- /dev/null +++ b/stack_test.go @@ -0,0 +1,71 @@ +package stack + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestNewStack(t *testing.T) { + s := NewStack[int]() + assert.NotNil(t, s) +} + +func TestStackPush(t *testing.T) { + s := NewStack[int]() + s.Push(2) + s.Push(10) + + assert.Equal(t, s.Peek(), 10) + assert.Equal(t, *s.PeekPtr(), 10) +} + +func TestStackPop(t *testing.T) { + s := NewStack[int]() + s.Push(2) + s.Push(10) + + x, err := s.Pop() + assert.NotNil(t, x) + assert.NoError(t, err) + assert.Equal(t, *x, 10) +} + +func TestStackPopEmpty(t *testing.T) { + s := NewStack[int]() + x, err := s.Pop() + assert.Error(t, err) + assert.Nil(t, x) +} + +func TestStackClear(t *testing.T) { + s := NewStack[int]() + s.Push(10) + s.Push(11) + assert.Equal(t, s.Size(), 2) + s.Clear() + assert.Equal(t, s.Size(), 0) +} + +func TestStackComplete(t *testing.T) { + s := NewStack[int]() + s.Push(1) + s.Push(2) + s.Push(3) + + assert.Equal(t, s.Size(), 3) + x := s.Peek() + assert.Equal(t, 3, x) + + y := s.PeekPtr() + assert.NotNil(t, y) + assert.Equal(t, 3, *y) + + z, err := s.Pop() + assert.NoError(t, err) + assert.Equal(t, *z, 3) + assert.Equal(t, s.Peek(), 2) + assert.Equal(t, s.Size(), 2) + + s.Clear() + assert.Equal(t, s.Size(), 0) +}