Merge pull request #41 from liutianyi1989/master
fix bugs of array stack & 09_queue by golang
This commit is contained in:
commit
982801c002
@ -28,12 +28,17 @@ func (this *ArrayStack) IsEmpty() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *ArrayStack) Push(v interface{}) {
|
func (this *ArrayStack) Push(v interface{}) {
|
||||||
this.data = append(this.data, v)
|
|
||||||
if this.top < 0 {
|
if this.top < 0 {
|
||||||
this.top = 0
|
this.top = 0
|
||||||
} else {
|
} else {
|
||||||
this.top += 1
|
this.top += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if this.top > len(this.data)-1 {
|
||||||
|
this.data = append(this.data, v)
|
||||||
|
} else {
|
||||||
|
this.data[this.top] = v
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *ArrayStack) Pop() interface{} {
|
func (this *ArrayStack) Pop() interface{} {
|
||||||
|
@ -6,7 +6,12 @@ func TestArrayStack_Push(t *testing.T) {
|
|||||||
s := NewArrayStack()
|
s := NewArrayStack()
|
||||||
s.Push(1)
|
s.Push(1)
|
||||||
s.Push(2)
|
s.Push(2)
|
||||||
|
t.Log(s.Pop())
|
||||||
s.Push(3)
|
s.Push(3)
|
||||||
|
t.Log(s.Pop())
|
||||||
|
t.Log(s.Pop())
|
||||||
|
s.Push(4)
|
||||||
|
t.Log(s.Pop())
|
||||||
s.Print()
|
s.Print()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
72
go/09_queue/CircularQueue.go
Normal file
72
go/09_queue/CircularQueue.go
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
package _9_queue
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type CircularQueue struct {
|
||||||
|
q []interface{}
|
||||||
|
capacity int
|
||||||
|
head int
|
||||||
|
tail int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCircularQueue(n int) *CircularQueue {
|
||||||
|
if n == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return &CircularQueue{make([]interface{}, n), n, 0, 0}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
栈空条件:head==tail为true
|
||||||
|
*/
|
||||||
|
func (this *CircularQueue) IsEmpty() bool {
|
||||||
|
if this.head == this.tail {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
栈满条件:(tail+1)%capacity==head为true
|
||||||
|
*/
|
||||||
|
func (this *CircularQueue) IsFull() bool {
|
||||||
|
if this.head == (this.tail+1)%this.capacity {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *CircularQueue) EnQueue(v interface{}) bool {
|
||||||
|
if this.IsFull() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
this.q[this.tail] = v
|
||||||
|
this.tail = (this.tail + 1) % this.capacity
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *CircularQueue) DeQueue() interface{} {
|
||||||
|
if this.IsEmpty() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
v := this.q[this.head]
|
||||||
|
this.head = (this.head + 1) % this.capacity
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *CircularQueue) String() string {
|
||||||
|
if this.IsEmpty() {
|
||||||
|
return "empty queue"
|
||||||
|
}
|
||||||
|
result := "head"
|
||||||
|
var i = this.head
|
||||||
|
for true {
|
||||||
|
result += fmt.Sprintf("<-%+v", this.q[i])
|
||||||
|
i = (i + 1) % this.capacity
|
||||||
|
if i == this.tail {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result += "<-tail"
|
||||||
|
return result
|
||||||
|
}
|
37
go/09_queue/CircularQueue_test.go
Normal file
37
go/09_queue/CircularQueue_test.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package _9_queue
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestCircularQueue_EnQueue(t *testing.T) {
|
||||||
|
q := NewCircularQueue(5)
|
||||||
|
q.EnQueue(1)
|
||||||
|
q.EnQueue(2)
|
||||||
|
q.EnQueue(3)
|
||||||
|
q.EnQueue(4)
|
||||||
|
q.EnQueue(5)
|
||||||
|
q.EnQueue(6)
|
||||||
|
t.Log(q)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestCircularQueue_DeQueue(t *testing.T) {
|
||||||
|
q := NewCircularQueue(5)
|
||||||
|
q.EnQueue(1)
|
||||||
|
q.EnQueue(2)
|
||||||
|
q.EnQueue(3)
|
||||||
|
q.EnQueue(4)
|
||||||
|
q.EnQueue(5)
|
||||||
|
q.EnQueue(6)
|
||||||
|
t.Log(q)
|
||||||
|
t.Log(q.DeQueue())
|
||||||
|
t.Log(q)
|
||||||
|
q.EnQueue(5)
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
}
|
44
go/09_queue/QueueBasedOnArray.go
Normal file
44
go/09_queue/QueueBasedOnArray.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package _9_queue
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type ArrayQueue struct {
|
||||||
|
q []interface{}
|
||||||
|
capacity int
|
||||||
|
head int
|
||||||
|
tail int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewArrayQueue(n int) *ArrayQueue {
|
||||||
|
return &ArrayQueue{make([]interface{}, n), n, 0, 0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ArrayQueue) EnQueue(v interface{}) bool {
|
||||||
|
if this.tail == this.capacity {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
this.q[this.tail] = v
|
||||||
|
this.tail++
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ArrayQueue) DeQueue() interface{} {
|
||||||
|
if this.head == this.tail {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
v := this.q[this.head]
|
||||||
|
this.head++
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ArrayQueue) String() string {
|
||||||
|
if this.head == this.tail {
|
||||||
|
return "empty queue"
|
||||||
|
}
|
||||||
|
result := "head"
|
||||||
|
for i := this.head; i <= this.tail-1; i++ {
|
||||||
|
result += fmt.Sprintf("<-%+v", this.q[i])
|
||||||
|
}
|
||||||
|
result += "<-tail"
|
||||||
|
return result
|
||||||
|
}
|
35
go/09_queue/QueueBasedOnArray_test.go
Normal file
35
go/09_queue/QueueBasedOnArray_test.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package _9_queue
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestArrayQueue_EnQueue(t *testing.T) {
|
||||||
|
q := NewArrayQueue(5)
|
||||||
|
q.EnQueue(1)
|
||||||
|
q.EnQueue(2)
|
||||||
|
q.EnQueue(3)
|
||||||
|
q.EnQueue(4)
|
||||||
|
q.EnQueue(5)
|
||||||
|
q.EnQueue(6)
|
||||||
|
t.Log(q)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestArrayQueue_DeQueue(t *testing.T) {
|
||||||
|
q := NewArrayQueue(5)
|
||||||
|
q.EnQueue(1)
|
||||||
|
q.EnQueue(2)
|
||||||
|
q.EnQueue(3)
|
||||||
|
q.EnQueue(4)
|
||||||
|
q.EnQueue(5)
|
||||||
|
q.EnQueue(6)
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
}
|
52
go/09_queue/QueueBasedOnLinkedList.go
Normal file
52
go/09_queue/QueueBasedOnLinkedList.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package _9_queue
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type ListNode struct {
|
||||||
|
val interface{}
|
||||||
|
next *ListNode
|
||||||
|
}
|
||||||
|
|
||||||
|
type LinkedListQueue struct {
|
||||||
|
head *ListNode
|
||||||
|
tail *ListNode
|
||||||
|
length int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLinkedListQueue() *LinkedListQueue {
|
||||||
|
return &LinkedListQueue{nil, nil, 0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LinkedListQueue) EnQueue(v interface{}) {
|
||||||
|
node := &ListNode{v, nil}
|
||||||
|
if nil == this.tail {
|
||||||
|
this.tail = node
|
||||||
|
this.head = node
|
||||||
|
} else {
|
||||||
|
this.tail.next = node
|
||||||
|
this.tail = node
|
||||||
|
}
|
||||||
|
this.length++
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LinkedListQueue) DeQueue() interface{} {
|
||||||
|
if this.head == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
v := this.head.val
|
||||||
|
this.head = this.head.next
|
||||||
|
this.length--
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LinkedListQueue) String() string {
|
||||||
|
if this.head == nil {
|
||||||
|
return "empty queue"
|
||||||
|
}
|
||||||
|
result := "head<-"
|
||||||
|
for cur := this.head; cur != nil; cur = cur.next {
|
||||||
|
result += fmt.Sprintf("<-%+v", cur.val)
|
||||||
|
}
|
||||||
|
result += "<-tail"
|
||||||
|
return result
|
||||||
|
}
|
35
go/09_queue/QueueBasedOnLinkedList_test.go
Normal file
35
go/09_queue/QueueBasedOnLinkedList_test.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package _9_queue
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestListQueue_EnQueue(t *testing.T) {
|
||||||
|
q := NewLinkedListQueue()
|
||||||
|
q.EnQueue(1)
|
||||||
|
q.EnQueue(2)
|
||||||
|
q.EnQueue(3)
|
||||||
|
q.EnQueue(4)
|
||||||
|
q.EnQueue(5)
|
||||||
|
q.EnQueue(6)
|
||||||
|
t.Log(q)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestListQueue_DeQueue(t *testing.T) {
|
||||||
|
q := NewLinkedListQueue()
|
||||||
|
q.EnQueue(1)
|
||||||
|
q.EnQueue(2)
|
||||||
|
q.EnQueue(3)
|
||||||
|
q.EnQueue(4)
|
||||||
|
q.EnQueue(5)
|
||||||
|
q.EnQueue(6)
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
q.DeQueue()
|
||||||
|
t.Log(q)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user