将一般数组转换为圆形arry

时间:2015-02-24 20:06:59

标签: java arrays rotation

我遇到了一个需要将常规数组转换为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?

由于

1 个答案:

答案 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函数获取当前位置作为参数,如果它是数组的末尾并且填充大小不等于数组长度(这意味着前面有空闲空间)返回前端位置,如果位置在它将在数组中间正常递增。