和栈相反,,队列(queue)是一种先进先出的线性表。它只允许在表的一端进行插入,而在表的另一端删除元素。这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开。
在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front)。假设队列为 q=(a1,a2,…,an) ,那么,a1 就是队头元素,an 就是队尾元素。队列中的元素是按照 a1,a2,…,an 的顺序进入的,退出队列也只能按照这个次序退出,也就是说,只有 a1,a2,…,an-1 都离开队列之后,an才能退出队列。
队列的底层实现
- void offer(int element) 入队
- int poll() 出队(队首元素出队),返回队首元素的值
- boolean isEmpty() 判断队列是否为空
- void showQueue() 遍历队列元素(从队首至队尾)
package util;
import java.util.Arrays;
public class MyQueue {
//队列的底层使用数组来存储数据
int[] elements;
public MyQueue() {
elements = new int[0];
}
//入队
public void offer(int element) {
int[] newarr = new int[elements.length+1];
for(int i=0;i<elements.length;i++) {
newarr[i] = elements[i];
}
newarr[elements.length] = element;
elements = newarr;
}
//出队
public int poll() {
if(elements.length==0) {
throw new RuntimeException("Queue is empty");
}
//取出队首元素
int element = elements[0];
int[] newarr = new int[elements.length-1];
for(int i=0;i<newarr.length;i++) {
newarr[i] = elements[i+1];
}
elements = newarr;
return element;
}
//判断队列是否为空
public boolean isEmpty() {
if(elements.length==0) {
throw new RuntimeException("Queue is empty");
}
return elements.length==0;
}
//遍历队列(从队首到队尾)
public void showQueue() {
System.out.println(Arrays.toString(elements));
}
}
简单Test:
package classify;
import util.MyQueue;
public class QueueTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个队列
MyQueue ue = new MyQueue();
//入队
ue.offer(9);
ue.offer(8);
ue.offer(7);
ue.offer(6);
//出队
System.out.println(ue.poll()); //9
System.out.println(ue.poll()); //8
//判断队列是否为空
System.out.println(ue.isEmpty()); //fasle
//遍历队列(从队首到队尾)
ue.showQueue(); //[7,6]
}
}