如何创建一个简单的圆形数组?

时间:2014-09-22 18:38:34

标签: algorithm queue implementation abstract-data-type

根据我的教科书,可以完成Queue ADT的实现:

  • 使用圆形阵列
  • 使用链接列表

如何创建简单的圆形数组?我不确定它是否被广泛使用。它只是一个链表,最后一个项目指向第一个项目吗?

2 个答案:

答案 0 :(得分:3)

Wikipedia上有几个环缓冲区和设计权衡关联的例子。

TypeScript中最简单的例子是:

class RingBuffer<T> {
  private backing: Array<T>;
  private size: number;
  private start: number;
  get length(): number {
    return this.size;
  }
  constructor(private maxSize: number) {
    this.backing = [];
    this.start = 0;
    this.size = 0;
  }
  public push(...ts: Array<T>): number {
    if (this.size + ts.length > this.maxSize) {
      throw new Error('Ring overflow error.');
    }
    for (const t of ts) {
      this.backing[(this.start + this.size) % this.maxSize] = t;
      this.size++;
    }
    return this.size;
  }
  public shift() {
    if (this.size === 0) {
      throw new Error('No such element.');
    }
    this.size--;
    const val = this.backing[this.start];
    this.start = (this.start + 1) % this.maxSize;
    return val;
  }
  public pop() {
    if (this.size === 0) {
      throw new Error('No such element.');
    }
    this.size--;
    return this.backing[(this.start + this.size) % this.maxSize];
  }
}

基本思想是它是一个固定大小的数组,当你试图越来越多地填充它时,它会使用一点指针数学循环回到开头。它可能会或可能不会检查上述方式。

答案 1 :(得分:0)

对于Java (以及许多其他语言中的类似语言),有2种选择:

  • 固定大小,Object[]作为内部存储。
    方法:size() / rotate() / get(index) / set(index, value)
  • 灵活的大小,ArrayList<T>作为内部存储。
    除了固定大小版本可以执行的操作之外,它还可以add(value) / add(index, value) / remove(index) / remove(value) / indexOf(index) / lastIndexOf(index)。 / li>

提示:

  • Linked list并不是很好的选择,因为通过索引访问元素的速度很慢。
  • 两个选择都使用int head指向循环索引。
    需要维护它,并在各种操作中在它和内部结构的实际索引之间进行转换。