前段时间看各位博主写的java队列程序,在这里给出自己的解决方法,望借鉴。
//实现队列自定义, 还有点问题
/*对于队列来说,rear一直指向队尾要加入的一个元素,而不是已有的元素,所以在入队列时候,是先
data[rear]=obj,然后再rear++,指向下一个空位置;
front则指向队列首元素,故在出队列时候,也是先obj=data[front],然后front++;
size为队列的长度;
MaxSize为队列所用数组的长度;
取首元素等操作时候用到data[(front+1)%data.length],front+1为正常data的下标,因为使用循环数组,故取余;
详见http://wenku.baidu.com/view/d69287a9d1f34693daef3e7a.html
*/
public class myQueue {
/**
* @param args
*/
private int front;
private int rear;
private int size;
private Object[] data;
public myQueue(int MaxSize) {
front = rear = 0;
data = new Object[MaxSize];
}
public int getSize() {
return size;
}
// 入队列,如果数组长度不够,就长度翻倍,先加元素再rear++,rear开始时候指向队尾的下一个元素位置
public void enter(Object o) {
if (size >= data.length) {
Object[] newdata = new Object[data.length * 2];
for (int i = 0; i < data.length; i++) {
newdata[i] = data[i];
}
data = newdata;
}
data[rear] = o;
rear++;
size++;
}
// 出队列,用front时候,要除以数组长度取余
public Object leave() throws Exception {
Object o = null;
if (size > 0) {
o = data[front];
front = (front + 1) % data.length;
size--;
return o;
}
throw new Exception("队列为空");
}
public Object peek() {
if (size <= 0) {
System.out.println("队列为空");
}
return data[(front) % data.length];
}
// rear=front则为空
public boolean isEmpty() {
return rear == front;
}
public void clear() {
front = rear = 0;
}
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
myQueue mq = new myQueue(10);
for (int i = 0; i < 10; i++) {
mq.enter(i);
}
while (!mq.isEmpty()) {
System.out.println(mq.leave());
}
}
}