了解队列(顺序队列)的实现方法
-
续上节,我们来说说顺序队列的实现,队列对所存储数据的存取方式是FIFO的。
为了实现队列这种数据结构,以下元素是必不可少的:
1.一个任意大小的数组;
2.一个用于存放排在队头的数据对应的索引的变量;
3.一个用于存放排在队尾的数据对应的索引的变量;
4.一对儿函数,分别用于把数据存入到队列中和从队列中把数据取出来。 -
主要需要实现的方法有
public interface IQueue<T> {
public void clear(); //将队列置空
public boolean isEmpty(); //判断队列是否为空
public int length(); //返回队列的数据元素个数
public T peek() throws Exception; //返回队首元素
public void offer(T t) throws Exception; //将数据元素x插入到队列成为队尾元素
public T poll() throws Exception; //将队首元素删除并返回其值
public void display(); //输出队列中所有元素
}
- 具体实现
public class MyQueue implements IQueue<Integer> {
private int[] arrs = new int[100]; //队列本质的数组
private int front = 0; //队首元素指针
private int rear = 0; //队尾元素指针
@Override
public void clear() {
// TODO Auto-generated method stub
/*
* 重置数组,队首队尾指针
*/
front = 0;
rear = 0;
arrs = new int[100];
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
/*
* 队首指针和队列指针的设置是这样的:
* 队首指针指向队首元素所在位置;
* 队尾指针指向队尾元素的下一个位置;
* 也就说如果队中有元素两指针一定不相等,相等即为空;
*/
if(front == rear) {
return true;
}
return false;
}
@Override
public int length() {
// TODO Auto-generated method stub
int length = rear - front;
return length;
}
@Override
public Integer peek() throws Exception {
// TODO Auto-generated method stub
if(isEmpty()) {
throw new Exception("队列为空");
}
return arrs[front];
}
@Override
public void offer(Integer t) throws Exception {
// TODO Auto-generated method stub
if(rear == arrs.length) {
throw new Exception("队列溢出");
}
arrs[rear] = t;
rear++;
}
@Override
public Integer poll() throws Exception {
// TODO Auto-generated method stub
if(isEmpty()) {
throw new Exception("队列为空");
}
Integer poll = arrs[front];
front++;
return poll;
}
@Override
public void display() {
// TODO Auto-generated method stub
for(int i = rear - 1; i >= front; i--) {
System.out.print(arrs[i] + " ");
}
}
}
- 测试
public class MyQueueTest {
public static void main(String[] args) throws Exception {
MyQueue myQueue = new MyQueue();
myQueue.offer(1);
myQueue.offer(2);
myQueue.offer(3);
myQueue.offer(4);
myQueue.offer(5);
System.out.println("队列元素个数 " + myQueue.length());
myQueue.display();
System.out.println();
System.out.println("----------");
System.out.println(myQueue.peek());
myQueue.poll();
System.out.println("队列元素个数 " + myQueue.length());
myQueue.display();
}
}
测试结果
- 缺陷:
可能出现假溢出现象,即队尾指针等于数组长度,而队首指针可能并不是指向0这个位置,导致一些空间的浪费,怎么解决?