我遇到了一个需要将常规数组转换为CircularArray的问题。该解决方案使用以下函数在CircularArray中旋转和检索虚拟索引:
head = 0;
int[] items;
int convert(int index){
if(index < 0){
index += items.length;
}
return (head+index)%items.length;
}
使用上述功能的其他方法
旋转:
void rotate(int shiftRight){
head = convert(shiftRight);
}
组:
set(int i, int xxx){
items[convert(i) = xxx;
}
有人可以帮我解释这个功能是如何工作的吗?为什么我们需要%items.length?
由于
答案 0 :(得分:0)
这是我前段时间做过的循环数组(队列)的一个例子。每当添加元素时,使用Inc()函数来计算位置。
希望这有助于解决您的问题。
public class MyQueue {
public int front,rear,size;
int Q[];
MyQueue(int x){
Q=new int[x];
front=0;
rear=-1;
size=0;
}
public boolean isEmpty(){
return size==0;
}
public boolean isFull(){
return size==Q.length;
}
public int Inc(int x){
if(front==Q.length-1){
return 0;
}else{
return ++x;
}
}
public void push(int x) throws Exception{
if(!isFull()){
Q[Inc(rear)]=x;
size++;
}else{
throw new Exception();
}
}
public int pop() throws Exception{
if(!isEmpty()){
size--;
int temp=Q[front];
Inc(front);
return temp;
}else{
throw new Exception();
}
}
public int top() throws Exception{
if(!isEmpty()){
int temp=Q[front];
return temp;
}else{
throw new Exception();
}
}
}
Inc函数获取当前位置作为参数,如果它是数组的末尾并且填充大小不等于数组长度(这意味着前面有空闲空间)返回前端位置,如果位置在它将在数组中间正常递增。