08_stack
This commit is contained in:
parent
b870907d0c
commit
e2b841f984
56
go/08_stack/SimpleBrowser.go
Normal file
56
go/08_stack/SimpleBrowser.go
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
package _8_stack
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
type Browser struct {
|
||||||
|
forwardStack Stack
|
||||||
|
backStack Stack
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBrowser() *Browser {
|
||||||
|
return &Browser{
|
||||||
|
forwardStack: NewArrayStack(),
|
||||||
|
backStack: NewLinkedListStack(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Browser) CanForward() bool {
|
||||||
|
if this.forwardStack.IsEmpty() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Browser) CanBack() bool {
|
||||||
|
if this.backStack.IsEmpty() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Browser) Open(addr string) {
|
||||||
|
fmt.Printf("Open new addr %+v\n", addr)
|
||||||
|
this.forwardStack.Flush()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Browser) PushBack(addr string) {
|
||||||
|
this.backStack.Push(addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Browser) Forward() {
|
||||||
|
if this.forwardStack.IsEmpty() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
top := this.forwardStack.Pop()
|
||||||
|
this.backStack.Push(top)
|
||||||
|
fmt.Printf("forward to %+v\n", top)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *Browser) Back() {
|
||||||
|
if this.backStack.IsEmpty() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
top := this.backStack.Pop()
|
||||||
|
this.forwardStack.Push(top)
|
||||||
|
fmt.Printf("back to %+v\n", top)
|
||||||
|
}
|
29
go/08_stack/SimpleBrowser_test.go
Normal file
29
go/08_stack/SimpleBrowser_test.go
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package _8_stack
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestBrowser(t *testing.T) {
|
||||||
|
b := NewBrowser()
|
||||||
|
b.PushBack("www.qq.com")
|
||||||
|
b.PushBack("www.baidu.com")
|
||||||
|
b.PushBack("www.sina.com")
|
||||||
|
if b.CanBack() {
|
||||||
|
b.Back()
|
||||||
|
}
|
||||||
|
if b.CanForward() {
|
||||||
|
b.Forward()
|
||||||
|
}
|
||||||
|
if b.CanBack() {
|
||||||
|
b.Back()
|
||||||
|
}
|
||||||
|
if b.CanBack() {
|
||||||
|
b.Back()
|
||||||
|
}
|
||||||
|
if b.CanBack() {
|
||||||
|
b.Back()
|
||||||
|
}
|
||||||
|
b.Open("www.taobao.com")
|
||||||
|
if b.CanForward() {
|
||||||
|
b.Forward()
|
||||||
|
}
|
||||||
|
}
|
67
go/08_stack/StackBasedOnArray.go
Normal file
67
go/08_stack/StackBasedOnArray.go
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
package _8_stack
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
/*
|
||||||
|
基于数组实现的栈
|
||||||
|
*/
|
||||||
|
|
||||||
|
type ArrayStack struct {
|
||||||
|
//数据
|
||||||
|
data []interface{}
|
||||||
|
//栈顶指针
|
||||||
|
top int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewArrayStack() *ArrayStack {
|
||||||
|
return &ArrayStack{
|
||||||
|
data: make([]interface{}, 0, 32),
|
||||||
|
top: -1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ArrayStack) IsEmpty() bool {
|
||||||
|
if this.top < 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ArrayStack) Push(v interface{}) {
|
||||||
|
this.data = append(this.data, v)
|
||||||
|
if this.top < 0 {
|
||||||
|
this.top = 0
|
||||||
|
} else {
|
||||||
|
this.top += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ArrayStack) Pop() interface{} {
|
||||||
|
if this.IsEmpty() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
v := this.data[this.top]
|
||||||
|
this.top -= 1
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ArrayStack) Top() interface{} {
|
||||||
|
if this.IsEmpty() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return this.data[this.top]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ArrayStack) Flush() {
|
||||||
|
this.top = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *ArrayStack) Print() {
|
||||||
|
if this.IsEmpty() {
|
||||||
|
fmt.Println("empty statck")
|
||||||
|
} else {
|
||||||
|
for i := this.top; i >= 0; i-- {
|
||||||
|
fmt.Println(this.data[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
41
go/08_stack/StackBasedOnArray_test.go
Normal file
41
go/08_stack/StackBasedOnArray_test.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package _8_stack
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestArrayStack_Push(t *testing.T) {
|
||||||
|
s := NewArrayStack()
|
||||||
|
s.Push(1)
|
||||||
|
s.Push(2)
|
||||||
|
s.Push(3)
|
||||||
|
s.Print()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestArrayStack_Pop(t *testing.T) {
|
||||||
|
s := NewArrayStack()
|
||||||
|
s.Push(1)
|
||||||
|
s.Push(2)
|
||||||
|
s.Push(3)
|
||||||
|
s.Print()
|
||||||
|
|
||||||
|
t.Log(s.Pop())
|
||||||
|
t.Log(s.Pop())
|
||||||
|
t.Log(s.Pop())
|
||||||
|
t.Log(s.Pop())
|
||||||
|
s.Print()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestArrayStack_Top(t *testing.T) {
|
||||||
|
s := NewArrayStack()
|
||||||
|
s.Push(1)
|
||||||
|
s.Push(2)
|
||||||
|
s.Push(3)
|
||||||
|
|
||||||
|
t.Log(s.Top())
|
||||||
|
s.Pop()
|
||||||
|
t.Log(s.Top())
|
||||||
|
s.Pop()
|
||||||
|
t.Log(s.Top())
|
||||||
|
s.Pop()
|
||||||
|
t.Log(s.Top())
|
||||||
|
s.Pop()
|
||||||
|
}
|
63
go/08_stack/StackBasedOnLinkedList.go
Normal file
63
go/08_stack/StackBasedOnLinkedList.go
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
package _8_stack
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
/*
|
||||||
|
基于链表实现的栈
|
||||||
|
*/
|
||||||
|
type node struct {
|
||||||
|
next *node
|
||||||
|
val interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
type LinkedListStack struct {
|
||||||
|
//栈顶节点
|
||||||
|
topNode *node
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLinkedListStack() *LinkedListStack {
|
||||||
|
return &LinkedListStack{nil}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LinkedListStack) IsEmpty() bool {
|
||||||
|
if this.topNode == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LinkedListStack) Push(v interface{}) {
|
||||||
|
this.topNode = &node{next: this.topNode, val: v}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LinkedListStack) Pop() interface{} {
|
||||||
|
if this.IsEmpty() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
v := this.topNode.val
|
||||||
|
this.topNode = this.topNode.next
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LinkedListStack) Top() interface{} {
|
||||||
|
if this.IsEmpty() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return this.topNode.val
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LinkedListStack) Flush() {
|
||||||
|
this.topNode = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *LinkedListStack) Print() {
|
||||||
|
if this.IsEmpty() {
|
||||||
|
fmt.Println("empty stack")
|
||||||
|
} else {
|
||||||
|
cur := this.topNode
|
||||||
|
for nil != cur {
|
||||||
|
fmt.Println(cur.val)
|
||||||
|
cur = cur.next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
41
go/08_stack/StackBasedOnLinkedList_test.go
Normal file
41
go/08_stack/StackBasedOnLinkedList_test.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package _8_stack
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestLinkedListStack_Push(t *testing.T) {
|
||||||
|
s := NewLinkedListStack()
|
||||||
|
s.Push(1)
|
||||||
|
s.Push(2)
|
||||||
|
s.Push(3)
|
||||||
|
s.Print()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLinkedListStack_Pop(t *testing.T) {
|
||||||
|
s := NewLinkedListStack()
|
||||||
|
s.Push(1)
|
||||||
|
s.Push(2)
|
||||||
|
s.Push(3)
|
||||||
|
s.Print()
|
||||||
|
|
||||||
|
t.Log(s.Pop())
|
||||||
|
t.Log(s.Pop())
|
||||||
|
t.Log(s.Pop())
|
||||||
|
t.Log(s.Pop())
|
||||||
|
s.Print()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLinkedListStack_Top(t *testing.T) {
|
||||||
|
s := NewLinkedListStack()
|
||||||
|
s.Push(1)
|
||||||
|
s.Push(2)
|
||||||
|
s.Push(3)
|
||||||
|
|
||||||
|
t.Log(s.Top())
|
||||||
|
s.Pop()
|
||||||
|
t.Log(s.Top())
|
||||||
|
s.Pop()
|
||||||
|
t.Log(s.Top())
|
||||||
|
s.Pop()
|
||||||
|
t.Log(s.Top())
|
||||||
|
s.Pop()
|
||||||
|
}
|
9
go/08_stack/StatckInterface.go
Normal file
9
go/08_stack/StatckInterface.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package _8_stack
|
||||||
|
|
||||||
|
type Stack interface {
|
||||||
|
Push(v interface{})
|
||||||
|
Pop() interface{}
|
||||||
|
IsEmpty() bool
|
||||||
|
Top() interface{}
|
||||||
|
Flush()
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user