根据我的教科书,可以完成Queue ADT的实现:
如何创建简单的圆形数组?我不确定它是否被广泛使用。它只是一个链表,最后一个项目指向第一个项目吗?
答案 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
指向循环索引。