golang数据结构和算法之CircularBuffer环形缓冲队列

Posted aguncn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang数据结构和算法之CircularBuffer环形缓冲队列相关的知识,希望对你有一定的参考价值。

慢慢练语法和思路,

想说的都在代码及注释里。

CircularBuffer

package CircularBuffer

const arraySize = 10

type CircularBuffer struct {
	data    [arraySize]int
	pointer int
}

//只实现了CircularBuffer环形缓冲队列的基本方法
func (b *CircularBuffer) InsertValue(i int) {
	if b.pointer == len(b.data) {
		b.pointer = 0
	}
	b.data[b.pointer] = i
	b.pointer += 1
}

func (b *CircularBuffer) GetValues() [arraySize]int {
	return b.data
}

func (b *CircularBuffer) GetValuesFromPosition(i int) ([arraySize]int, bool) {
	var out [arraySize]int

	if i >= len(out) {
		return out, false
	}

	for u := 0; u < len(out); u++ {
		if i >= len(b.data) {
			i = 0
		}
		out[u] = b.data[i]
		i += 1
	}
	return out, true
}

  

CircularBuffer_test
package CircularBuffer

import (
	"fmt"
	"math/rand"
	"testing"
	"time"
)

func TestCircularBuffer(t *testing.T) {
	var cb CircularBuffer
	random := rand.New(rand.NewSource(time.Now().UnixNano()))

	//生成三轮随机数,来测试这个CircularBuffer
	for i := 0; i < 3*len(cb.data); i++ {
		cb.InsertValue(random.Intn(arraySize))
		fmt.Println(cb, cb.pointer, (i+1)%arraySize)
		//判断时,要排除在pointer最大时,因为此时,余数为0,而pointer为数组长度
		if cb.pointer != arraySize && cb.pointer != (i+1)%arraySize {
			t.Fail()
		}
		//其它几个方法,待测试
	}
}

  技术图片

以上是关于golang数据结构和算法之CircularBuffer环形缓冲队列的主要内容,如果未能解决你的问题,请参考以下文章

Golang 学习之路

数据结构和算法(Golang实现)(23)排序算法-归并排序

golang:常用加密算法学习总结之非对称加密

Golang之排序算法

DES--------Golang对称加密之模式问题实战

2golang之快速排序