发现已经做了位置处理, 不需要再去改名

This commit is contained in:
2019-07-22 02:02:05 +08:00
parent 9263c03525
commit 76f81b9920
18 changed files with 272 additions and 167 deletions

View File

@@ -30,6 +30,16 @@ func NewIteratorWithCap(n *Node, cap int) *Iterator {
return iter
}
func (iter *Iterator) ToHead() {
for iter.Prev() {
}
}
func (iter *Iterator) ToTail() {
for iter.Next() {
}
}
func (iter *Iterator) GetNode() *Node {
return iter.cur
}
@@ -44,25 +54,7 @@ func (iter *Iterator) Value() interface{} {
return iter.cur.value
}
func (iter *Iterator) Left() bool {
if iter.cur.children[0] != nil {
iter.dir = 0
iter.cur = iter.cur.children[0]
return true
}
return false
}
func (iter *Iterator) Right() bool {
if iter.cur.children[1] != nil {
iter.dir = 0
iter.cur = iter.cur.children[1]
return true
}
return false
}
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
// iter := NewIterator(cur)
iter.SetNode(cur)
@@ -93,7 +85,7 @@ func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
return cur
}
func (iter *Iterator) Next() (result bool) {
func (iter *Iterator) Prev() (result bool) {
if iter.dir > -1 {
if iter.dir == 1 && iter.cur != nil {
@@ -121,7 +113,7 @@ func (iter *Iterator) Next() (result bool) {
return false
}
func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
func (iter *Iterator) GetNext(cur *Node, idx int) *Node {
// iter := NewIterator(cur)
iter.SetNode(cur)
@@ -152,7 +144,7 @@ func (iter *Iterator) GetPrev(cur *Node, idx int) *Node {
return cur
}
func (iter *Iterator) Prev() (result bool) {
func (iter *Iterator) Next() (result bool) {
if iter.dir < 1 { // 非 1(next 方向定义 -1 为 prev)
if iter.dir == -1 && iter.cur != nil { // 如果上次为prev方向, 则清空辅助计算的栈

View File

@@ -1,6 +1,9 @@
package pqueuekey
import "github.com/474420502/focus/compare"
import (
"github.com/474420502/focus/compare"
"github.com/davecgh/go-spew/spew"
)
type PriorityQueue struct {
queue *vbTree
@@ -78,3 +81,7 @@ func (pq *PriorityQueue) Remove(key interface{}) (interface{}, bool) {
func (pq *PriorityQueue) Values() []interface{} {
return pq.queue.Values()
}
func (pq *PriorityQueue) String() string {
return spew.Sprint(pq.queue.Values())
}

View File

@@ -1,11 +1,11 @@
package pqueuekey
import (
"log"
"testing"
"github.com/davecgh/go-spew/spew"
"github.com/474420502/focus/compare"
"github.com/davecgh/go-spew/spew"
)
func TestQueuePush(t *testing.T) {
@@ -345,3 +345,68 @@ func TestQueueIndex(t *testing.T) {
// pq.Pop()
// }
// }
func TestPriorityQueue_Iterator(t *testing.T) {
pq := New(compare.Int)
for i := 0; i < 5; i++ {
pq.Push(i, i)
}
pq.Push(-1, -1)
pq.Push(10, 10)
result := pq.String()
if result != "[10 4 3 2 1 0 -1]" {
t.Error("should be [10 4 3 2 1 0 -1]")
}
iter := pq.Iterator()
iter.ToHead()
values := pq.Values()
for i := 0; ; i++ {
if values[i] != iter.Value() {
t.Error(values[i], " != ", iter.Value())
}
if !iter.Next() {
break
}
}
}
func TestMain(t *testing.T) {
pq := New(compare.Int)
pq.Push(1, 1)
pq.Push(4, 4)
pq.Push(5, 5)
pq.Push(6, 6)
pq.Push(2, 2) // pq.Values() = [6 5 4 2 1]
log.Println(pq.Values())
value, _ := pq.Pop() // value = 6
log.Println(value)
value, _ = pq.Get(1) // value = 1 pq.Values() = [5 4 2 1]
log.Println(value)
value, _ = pq.Get(0) // value = nil , Get equal to Seach Key
log.Println(value)
value, _ = pq.Index(0) // value = 5, compare.Int the order from big to small
log.Println(value)
values := pq.GetRange(2, 5) // values = [2 4 5]
log.Println(values)
values = pq.GetRange(5, 2) // values = [5 4 2]
log.Println(values)
values = pq.GetRange(100, 2) // values = [5 4 2]
log.Println(values)
values3 := pq.GetAround(5) // values3 = [<nil>, 5, 4]
log.Println(values3)
iter := pq.Iterator() // Next 大到小 从root节点起始
log.Println(pq.String())
// log.Println(iter.Value()) 直接使用会报错,
iter.ToHead()
log.Println(iter.Value()) // 起始最大值. true 5
log.Println(iter.Prev(), iter.Value()) // false 5
// Prev 大到小
log.Println(iter.Next(), iter.Value()) // true 4
}