Working through 1.3 with Bags, Queues, and Stacks
This commit is contained in:
parent
a40ee71b5f
commit
bed7e5bef4
@ -9,7 +9,8 @@ TARGETS := \
|
|||||||
$(REPO_BASE)/algs4-average \
|
$(REPO_BASE)/algs4-average \
|
||||||
$(REPO_BASE)/algs4-interval2d \
|
$(REPO_BASE)/algs4-interval2d \
|
||||||
$(REPO_BASE)/algs4-date \
|
$(REPO_BASE)/algs4-date \
|
||||||
$(REPO_BASE)/algs4-test-accumulator
|
$(REPO_BASE)/algs4-test-accumulator \
|
||||||
|
$(REPO_BASE)/algs4-stats
|
||||||
|
|
||||||
|
|
||||||
test: build
|
test: build
|
||||||
|
53
algs4/src/go/algs4-stats/main.go
Normal file
53
algs4/src/go/algs4-stats/main.go
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/meatballhat/box-o-sand/algs4/src/go/algs4"
|
||||||
|
)
|
||||||
|
|
||||||
|
func die(err error) {
|
||||||
|
fmt.Fprintf(os.Stderr, "ERROR: %v\n", err)
|
||||||
|
os.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
numbers := algs4.NewBag()
|
||||||
|
|
||||||
|
for !algs4.Stdin.IsEmpty() {
|
||||||
|
d, err := algs4.Stdin.ReadDouble()
|
||||||
|
if err != nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
numbers.Add(d)
|
||||||
|
}
|
||||||
|
|
||||||
|
n := numbers.Size()
|
||||||
|
sum := float64(0.0)
|
||||||
|
|
||||||
|
for x := range numbers.Each() {
|
||||||
|
if val, ok := x.(float64); ok {
|
||||||
|
sum += val
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(os.Stderr, "%v is not a float64!", x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mean := sum / float64(n)
|
||||||
|
|
||||||
|
sum = float64(0.0)
|
||||||
|
for x := range numbers.Each() {
|
||||||
|
if val, ok := x.(float64); ok {
|
||||||
|
sum += (val - mean) * (val - mean)
|
||||||
|
} else {
|
||||||
|
fmt.Fprintf(os.Stderr, "%v is not a float64!", x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std := math.Sqrt(sum / (float64(n) - float64(1)))
|
||||||
|
|
||||||
|
fmt.Printf("Mean: %.2f\n", mean)
|
||||||
|
fmt.Printf("Std dev: %.2f\n", std)
|
||||||
|
}
|
50
algs4/src/go/algs4/bag.go
Normal file
50
algs4/src/go/algs4/bag.go
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
package algs4
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Bag struct {
|
||||||
|
items map[string]interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Item struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBag() *Bag {
|
||||||
|
return &Bag{
|
||||||
|
items: map[string]interface{}{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Bag) Add(item interface{}) {
|
||||||
|
me.items[me.hashItem(item)] = item
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Bag) IsEmpty() bool {
|
||||||
|
return len(me.items) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Bag) Size() int {
|
||||||
|
return len(me.items)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Bag) Each() <-chan interface{} {
|
||||||
|
out := make(chan interface{})
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
defer close(out)
|
||||||
|
for _, item := range me.items {
|
||||||
|
out <- item
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
return (<-chan interface{})(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Bag) hashItem(item interface{}) string {
|
||||||
|
t := reflect.TypeOf(item)
|
||||||
|
return fmt.Sprintf("%s%s%v", t.Name(), t.String(), &t)
|
||||||
|
}
|
@ -35,6 +35,15 @@ func (in *inputWrapper) ReadDouble() (float64, error) {
|
|||||||
return dbl, nil
|
return dbl, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (in *inputWrapper) IsEmpty() bool {
|
||||||
|
_, err := in.Inbuf.Peek(1)
|
||||||
|
if err != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func ReadInts(inbuf io.Reader) ([]int, error) {
|
func ReadInts(inbuf io.Reader) ([]int, error) {
|
||||||
ints := make([]int, 0)
|
ints := make([]int, 0)
|
||||||
|
|
||||||
|
34
algs4/src/go/algs4/queue.go
Normal file
34
algs4/src/go/algs4/queue.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package algs4
|
||||||
|
|
||||||
|
type Queue struct {
|
||||||
|
items []interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewQueue() *Queue {
|
||||||
|
return &Queue{
|
||||||
|
items: []interface{}{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Queue) Enqueue(item interface{}) {
|
||||||
|
me.items = append(me.items, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Queue) Dequeue() interface{} {
|
||||||
|
if me.IsEmpty() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := me.items[0]
|
||||||
|
me.items = me.items[1:]
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Queue) Size() int {
|
||||||
|
return len(me.items)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Queue) IsEmpty() bool {
|
||||||
|
return len(me.items) == 0
|
||||||
|
}
|
35
algs4/src/go/algs4/stack.go
Normal file
35
algs4/src/go/algs4/stack.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package algs4
|
||||||
|
|
||||||
|
type Stack struct {
|
||||||
|
items []interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewStack() *Stack {
|
||||||
|
return &Stack{
|
||||||
|
items: []interface{}{},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Stack) Push(item interface{}) {
|
||||||
|
me.items = append(me.items, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Stack) Pop() interface{} {
|
||||||
|
if me.IsEmpty() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
lastIdx := me.Size() - 1
|
||||||
|
lastItem := me.items[lastIdx]
|
||||||
|
me.items = me.items[:lastIdx]
|
||||||
|
|
||||||
|
return lastItem
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Stack) IsEmpty() bool {
|
||||||
|
return len(me.items) == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *Stack) Size() int {
|
||||||
|
return len(me.items)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user