数据结构——链队列
一、队列的基本概念?
队列是一种限定存取位置的线性表。它只允许在表的一端插入,在另一端删除。因此,从数据类型的角度来看,队列是一种独立的抽象数据类型。允许插入的一端叫做队尾,允许删除的一端叫做队头。
每次在队尾加入元素,因此入队的顺序为a1,a2,a3,…,an,最先入队的元素最先出队,所以队列具有的这种特性成为先进先出FIFO(First In First Out)
注意:数据元素可以是各种类型,但必须属于同一种数据元素类。
二、使用步骤
1.队列的接口定义
public interface Queue {
public void clear();
public int length();//返回链队列的长度
public boolean full();//判断是否为满
public boolean empty();//判断是否为空
public boolean enque(Object el);//入队
public Object dlque();//出队
public Object getfront();//返回队列的头元素
}
2.创建节点类
public class Node {
Object data;
Node next ;
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node(Object data,Node next ) {
this.next = next;
this.data = data;
}
public Node() {
this(null,null);
}
}
3.创建LinkedQueue类实现接口
3.1 初始化节点对象
Node front,rear;
public LinkedQueue() {
front=rear=new Node();//初始化头尾节点 构造空的队列
}
3.2 返回链队列的长度
@Override
public int length() {
Node p;//声明一个节点 p 用于指向头指针的下一个元素
int i=0;//初始化一个 i 用于计数
p = front.next;
while(p!=null) {
i++;
p=p.next;
}
return i;
}
3.3 空 与 满
@Override
public boolean full() {
//
return false;
}
@Override
public boolean empty() {
return rear == front;//为空的状态为 头尾指向同一节点
}
3.4 返回队列中第一个的数据
@Override
public Object getfront() {
//先判断为 空链表的情况
if(rear == front) {
return null;
}else {
return front.next.data;
}
}
3.5 入队 与 出队
@Override
public boolean enque(Object el) {
Node p ;//声明一个节点 用于存储 进队的元素
p = new Node(el,null); //因为队列添加元素是从队尾开始添加所以第二个参数为null
rear.next = p;
rear = p;//将队尾更换为p return true;
return true;
}
@Override
public Object dlque() {
Node s;//用于记录待出队
//队列为空时
if(rear == front) {
return null;
}
else {
s = front.next;
front.next = s.next;
//判断是否全部已经出队
if(s.next==null) {
rear=front;
}
return s.data;
}
}
3.6 输出队列中的元素的方法
static void pri(Queue q) {
LinkedQueue lq = new LinkedQueue();
Object ob;
while (!q.empty()) {
ob=q.dlque();
System.out.print(ob.toString()+"");
lq.enque(ob);
}System.out.println();
while (!q.empty()) {
q.enque(lq.dlque());
}
}
3.7 main函数中测试
public static void main(String[] args) {
LinkedQueue lq = new LinkedQueue();
lq.enque(new Character('w'));
lq.enque(new Character('o'));
lq.enque(new Character('r'));
lq.enque(new Character('d'));
lq.enque(new Character('w'));
lq.enque(new Character('o'));
lq.enque(new Character('r'));
lq.enque(new Character('d'));
pri(lq);
}
3.8 结果
wordword
小结
os:时隔这么这么久,我又开始写了。之前实在是太懒太懒,又不太熟悉写博客,每次写都要花费好长的时间,所以中途就变成了失踪人口。但想了想,笔记嘛,还是得写写的!!!每周花一点时间来整理整理就好了,对的,我一定可以坚持的。至于数据结构之前的内容,应该会补充笔记的,应该应该,啊,说到底还在想偷懒
对于一个队列,显然需要设置两个指针,分别是指向队列的头和尾(分别称为头指针和尾指针),反之,头指针和尾指针可以唯一地确定一个链队列。
空的链队列的裁决条件为头指针和尾指针均指向头节点。