我需要一个像双端队列的数据结构,我相信它被称为循环缓冲区。

这就是我所做的。

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的典型实现使用两个索引来标记队列的第一个和最后一个元素。无需显式存储状态,因为enqueuedequeue可以通过索引计算来完成。 swap方法的更好称呼是rotate

您可以删除orders数组并将dump实现更改为:

    int[] output = {
                      data[  (state+0)%4  ],
                      data[  (state+1)%4  ],
                      data[  (state+2)%4  ],
                      data[  (state+3)%4  ],
                   };

09-27 15:42