我需要一个像双端队列的数据结构,我相信它被称为循环缓冲区。
这就是我所做的。
public class MyStack {
byte[][] orders = { {0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}, {3, 0, 1, 2} };
byte state = 0;
int[] data = {1, 2, 3, 4};
void swap(int value){
data[state] = value;
if(state == 3){
state = 0;
}else{
state ++;
}
}
int[] dump(){
int[] output = {
data[ orders[state][0] ],
data[ orders[state][1] ],
data[ orders[state][2] ],
data[ orders[state][3] ],
};
return output;
}
}
这里的输出正是我需要的功能类型。它基本上是一个长度为四的窗口,它通过无限的离散空间或沿数字线移动。
我的问题是:此解决方案有效吗?是否有为此功能设计的内置库?如果是这样,是否值得使用?
最佳答案
circular buffer的典型实现使用两个索引来标记队列的第一个和最后一个元素。无需显式存储状态,因为enqueue
和dequeue
可以通过索引计算来完成。 swap
方法的更好称呼是rotate
。
您可以删除orders
数组并将dump
实现更改为:
int[] output = {
data[ (state+0)%4 ],
data[ (state+1)%4 ],
data[ (state+2)%4 ],
data[ (state+3)%4 ],
};