掌握了两种存储结构之后,其它的数据结构只是以这种存储结构为基础,实现逻辑上的数据结构。数组操纵的是索引,链表操纵的是指针!实际上栈和队列是“一样”的。
下面是以链表为存储结构实现的队列以及相关操作:
节点类:
package 队列;
//构造链表的节点类
public class Node {
public Object data;
public Node next;
//无参数时的构造函数
public Node() {
this(null,null);
}
//有一个参数时的构造函数
public Node(Object data) {
this.data = data;
}
//有两个参数时的构造函数
public Node(Object data,Node next) {
this.data = data;
this.next = next;
}
}//节点类的描述结束
链队列实现类:
package 队列;
public class LinkedQueue {
private Node first; //队首指针
private Node last; //队尾指针
//链队列类的构造函数
public LinkedQueue() {
first = last = null;
}
//队列清空
public void clear() {
first = last = null;
}
//判断队列是否为空
public boolean isEmpty() {
return first == null;
}
//求队列的长度
public int length() {
Node p = first;
int length = 0;
while(p != null) {
p = p.next;
length ++;
}
return length;
}
//取队首元素
public Object peek() {
if(first != null) //队列非空
return first.data; //返回队首节点的数据域
else
return null;
}
//入队操作
public void offer(Object value) {
Node p = new Node(value);
if(first != null) {
last.next = p;
last = p;
}
else
first = last = p;
}
//出队操作
public Object poll() {
if(first != null) {
Node p = first;
first = first.next;
if(p == last)
last = null;
return p.data;
}
else
return null;
}
//输出队列中的所有元素
public void disply() {
if(isEmpty()) {
return;
}else {
Node p = first;
while(p != null) {
System.out.print(p.data+" ");
p = p.next;
}
}
}
//测试集
public static void main(String[] args) {
LinkedQueue lq = new LinkedQueue();//创建队列对象
//入队
lq.offer(1);
lq.offer(2);
lq.offer(3);
lq.offer(4);
lq.offer(5);
//显示队列所有元素
lq.disply();
//查看队列长度
System.out.println("\n队列的长度为:"+lq.length());
//取队首元素
System.out.println(lq.peek());//使用peek()方法,只取不删
lq.disply();
//出队
System.out.println("\n出队列:"+lq.poll());//poll()方法,取队首元素并且删除
lq.disply();
}
}