环形队列问题

曹操不会飞 2012-09-13 04:29:37
请编写一个环形队列类,要求支持多线程读写,读写长度可参数化,队列长度限制在 256 个单元,读写策越为先进先出。当队列发生溢出时,依照先进先出的策略覆盖最早进入队列的元素。
求大神解读啊
...全文
131 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2012-09-13
  • 打赏
  • 举报
回复
双向链表组成环状队列。

public class CycleQueue<E> {

public static int DEFAULT_CAPACITY = 256;
class Entry{
Entry previous;
Entry next;
E element;
}

private Entry header;
private int capacity;
private int size=0;

public CycleQueue(){
this(DEFAULT_CAPACITY);
}

public CycleQueue(int capacity){
this.capacity=capacity;
header = new Entry();
header.next=header;
header.previous=header;
}

/**向队列里加入元素
* @param elem 所要添加的元素
* @return 当且仅当队列溢出时返回被替换的元素,其他情况返回<code>null</code>。
*/
public synchronized E offer(E elem){
if(size>=capacity){
E e = header.next.element;
header.element = elem;
header = header.next;
header.element=null;
return e;
}
Entry e = new Entry();
e.element = elem;
e.previous = header.previous;
e.next = header;
e.previous.next = e;
header.previous = e;
size++;
return null;
}

/**从队列里取得元素
* @return 当队列为空时,返回<code>null</code>
*/
public synchronized E poll(){
if(size<=0){
return null;
}
Entry e = header.next;
header.next = e.next;
e.next.previous = header;
size--;
return e.element;
}

/**
* 获得队列的容量
*/
public int getCapacity(){
return capacity;
}

/**
* 获得队列当前所含元素的个数
*/
public int size() {
return size;
}

/**
* 测试用例
*/
public static void main(String[] args) {
CycleQueue<Integer> queue = new CycleQueue<Integer>(5);
System.out.println(queue.offer(Integer.valueOf(0)));
System.out.println(queue.offer(Integer.valueOf(1)));
System.out.println(queue.offer(Integer.valueOf(2)));
System.out.println(queue.poll());
System.out.println(queue.poll());
for(int i=1;i<=5;i++){
queue.offer(i);
}
System.out.println(queue.offer(10));
System.out.println(queue.poll());
System.out.println(queue.poll());
}

}

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧