Skip to content

Commit 3e48650

Browse files
committed
unify bag and stack to linklist
1 parent af1ae09 commit 3e48650

File tree

6 files changed

+77
-77
lines changed

6 files changed

+77
-77
lines changed

algs4/bag.go

+3-20
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,12 @@ import (
44
"github.com/shellfly/algo/linklist"
55
)
66

7-
// Bag is a generic interface for bag
7+
// Bag implements a bag data type by linklist
88
type Bag struct {
99
*linklist.LinkList
10-
n int
1110
}
1211

13-
// NewBag creates a new Bag object
12+
// NewBag ...
1413
func NewBag() *Bag {
15-
return &Bag{linklist.NewLinkList(), 0}
16-
}
17-
18-
// Add a new item to bag
19-
func (b *Bag) Add(item interface{}) {
20-
b.LinkList.Add(item)
21-
b.n++
22-
}
23-
24-
// Size of the bag
25-
func (b *Bag) Size() int {
26-
return b.n
27-
}
28-
29-
// IsEmpty returns true if bag is empty
30-
func (b *Bag) IsEmpty() bool {
31-
return b.n == 0
14+
return &Bag{linklist.NewLinkList()}
3215
}

algs4/queue.go

+16
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,19 @@ func (q Queue) Slice() (items []interface{}) {
6060
}
6161
return
6262
}
63+
64+
// IntSlice returns a slice of int values for iterating
65+
func (q *Queue) IntSlice() (items []int) {
66+
for curr := q.first; curr != nil; curr = curr.Next {
67+
items = append(items, curr.Item.(int))
68+
}
69+
return
70+
}
71+
72+
// StringSlice returns a slice of int values for iterating
73+
func (q *Queue) StringSlice() (items []string) {
74+
for curr := q.first; curr != nil; curr = curr.Next {
75+
items = append(items, curr.Item.(string))
76+
}
77+
return
78+
}

algs4/stack.go

+5-26
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,26 @@ package algs4
22

33
import "github.com/shellfly/algo/linklist"
44

5-
// Stack ...
5+
// Stack implements a stack by linklist
66
type Stack struct {
7-
first *linklist.Node
8-
n int
7+
*linklist.LinkList
98
}
109

1110
// NewStack ...
1211
func NewStack() *Stack {
13-
return &Stack{}
14-
}
15-
16-
// IsEmpty ...
17-
func (s Stack) IsEmpty() bool {
18-
return s.first == nil
12+
return &Stack{linklist.NewLinkList()}
1913
}
2014

2115
// Push ...
2216
func (s *Stack) Push(item interface{}) {
23-
s.first = linklist.NewNode(item, s.first)
24-
s.n++
17+
s.LinkList.Add(item)
2518
}
2619

2720
// Pop ...
2821
func (s *Stack) Pop() (item interface{}) {
2922
if s.IsEmpty() {
3023
panic("Stack Empty")
3124
}
32-
item = s.first.Item
33-
s.first = s.first.Next
34-
return
35-
}
36-
37-
// Size ...
38-
func (s Stack) Size() int {
39-
return s.n
40-
}
41-
42-
// Slice ...
43-
func (s Stack) Slice() (items []interface{}) {
44-
for !s.IsEmpty() {
45-
items = append(items, s.Pop())
46-
}
25+
item = s.Del()
4726
return
4827
}

cmd/bag/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func main() {
4343
}
4444

4545
fmt.Println("size of bag = ", bag.Size())
46-
for _, item := range bag.Slice() {
46+
for _, item := range bag.StringSlice() {
4747
fmt.Println(item)
4848
}
4949
}

cmd/stack/main.go

+7-21
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,7 @@
77
* to be or not to - be - - that - - - is
88
*
99
* % go run cmd/stack/main.go < tobe.txt
10-
* size of stack = 14
11-
* is
12-
* -
13-
* -
14-
* -
15-
* that
16-
* -
17-
* -
18-
* be
19-
* -
20-
* to
21-
* not
22-
* or
23-
* be
24-
* to
10+
* to be not that or be (2 left on stack)
2511
*
2612
******************************************************************************/
2713

@@ -38,11 +24,11 @@ func main() {
3824
words := stdin.ReadAllStrings()
3925
stack := algs4.NewStack()
4026
for _, word := range words {
41-
stack.Push(word)
42-
}
43-
44-
fmt.Println("size of stack = ", stack.Size())
45-
for item := stack.Pop(); !stack.IsEmpty(); item = stack.Pop() {
46-
fmt.Println(item)
27+
if !(word == "-") {
28+
stack.Push(word)
29+
} else if !stack.IsEmpty() {
30+
fmt.Print(stack.Pop(), " ")
31+
}
4732
}
33+
fmt.Println("(", stack.Size(), " left on stack)")
4834
}

linklist/util.go

+45-9
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,61 @@ func NewNode(item interface{}, next *Node) *Node {
1313

1414
// LinkList ...
1515
type LinkList struct {
16-
first *Node
16+
First *Node
17+
n int // size
1718
}
1819

19-
// Add adds a new node
20-
func (l *LinkList) Add(item interface{}) (n *Node) {
21-
n = NewNode(item, l.first)
22-
l.first = n
20+
// NewLinkList return a linked list
21+
func NewLinkList() *LinkList {
22+
return &LinkList{nil, 0}
23+
}
24+
25+
// Add adds a new node to head, points to old head
26+
func (l *LinkList) Add(item interface{}) (node *Node) {
27+
node = NewNode(item, l.First)
28+
l.First = node
29+
l.n++
30+
return
31+
}
32+
33+
// Del removes head and returns its Item
34+
func (l *LinkList) Del() (item interface{}) {
35+
item = l.First.Item
36+
l.First = l.First.Next
37+
l.n--
2338
return
2439
}
2540

41+
// Size returns number of nodes in link list
42+
func (l *LinkList) Size() int {
43+
return l.n
44+
}
45+
46+
// IsEmpty reports if the link list is empty
47+
func (l *LinkList) IsEmpty() bool {
48+
return l.First == nil
49+
}
50+
2651
// Slice returns a slice of link list for iterating
2752
func (l *LinkList) Slice() (items []interface{}) {
28-
for curr := l.first; curr != nil; curr = curr.Next {
53+
for curr := l.First; curr != nil; curr = curr.Next {
2954
items = append(items, curr.Item)
3055
}
3156
return
3257
}
3358

34-
// NewLinkList return a linked list
35-
func NewLinkList() *LinkList {
36-
return &LinkList{nil}
59+
// IntSlice returns a slice of int values for iterating
60+
func (l *LinkList) IntSlice() (items []int) {
61+
for curr := l.First; curr != nil; curr = curr.Next {
62+
items = append(items, curr.Item.(int))
63+
}
64+
return
65+
}
66+
67+
// StringSlice returns a slice of int values for iterating
68+
func (l *LinkList) StringSlice() (items []string) {
69+
for curr := l.First; curr != nil; curr = curr.Next {
70+
items = append(items, curr.Item.(string))
71+
}
72+
return
3773
}

0 commit comments

Comments
 (0)