队列的定义和结构
队列是一种特殊的线性表,其特性体现在队列只允许在表尾插入数据元素,在表头删除元素,所以队列是一种操作受限的线性表,具有先进先出的特点。允许进行插入的一端称为队尾,允许进行删除的一端称为队首。队列也分为顺序和链式两种存储结构。
定义接口
interface Queue {
public void clear();//清空
public boolean isEmpty();//判空
public int length();//求长度
public Object peek();//读队首元素
public void offer(Object x)throws Exception;//插入元素
public Object poll();//删除元素
}
定义接口
class Node{
public Object data;//节点值
public Node next;//后继节点
public Node(){
this.data=null;
this.next=null;
}
public Node(Object data){
this.data=data;
this.next=null;
}
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
链式对列
public class LinkQueue implements Queue{
private Node front;//队首指针
private Node rear;//队尾指针
public LinkQueue(){
front=rear=null;
}
@Override
public void clear() {
front=rear=null;
}
@Override
public boolean isEmpty() {//判断队列是否为空
return front==null;
}
@Override
public int length() {//求长度
Node p=front;
int length=0;
while (p!=null){
p=p.next;
length++;
}
return length;
}
@Override
public Object peek() {//入队
if (front!=null){
return front.data;
}else {
return null;
}
}
@Override
public void offer(Object x) throws Exception {//出队
Node p=new Node(x);//构造新节点
if(front!=null){
rear.next=p;
rear=p;//后移一位
}
else{
front=rear=p;
}
}
@Override
public Object poll() {
if (front != null) {
Node p=front;
front=front.next;
if(p==rear){
rear=null;
}
return p.data;
} else {
return null;
}
}
//测试
public static void main(String[]args) throws Exception {
LinkQueue linkQueue = new LinkQueue();
System.out.println("队列是否为空:"+linkQueue.isEmpty());
System.out.println("连续入队-------------------------------");
for(int i=0;i<5;i++){
linkQueue.offer((char)(97+i));
}
System.out.println("队列长度为:"+linkQueue.length());
System.out.println("队首元素为:"+linkQueue.peek());
//出队
System.out.println("连续出队-------------------------------");
for(int i=0;i<4;i++){
Object data=linkQueue.poll();
}
System.out.println("队列长度为:"+linkQueue.length());
System.out.println("队首元素为:"+linkQueue.peek());
}
}