简介
链式队列也符合队列的基本模式,及先进先出,后进后出的原则,只是实现方式发生了改变,其图解为
红色的为引用,黑色的为节点
其具体实现方式见代码。
代码
/**
* 链式队列
* @author 焦焱
*
*/
public class LinkQueue {
/**
* 队头
*/
private Entry front = null;
/**
* 队尾
*/
private Entry rear = null;
/**
* 队的长度
*/
private int size = 0;
/**
* 节点类
* @author 14831
*
*/
class Entry
{
/**
* 节点的数据域
*/
int data;
/**
* 节点的指针域
*/
Entry next;
/**
* 有参构造
* @param val
*/
public Entry(int val) {
this.data = val;
this.next = null;
}
/**
* 无参默认构造
*/
public Entry() {
this(-1);
}
}
/**
* 入队
* @param val 数据
*/
public void Push(int val)
{ //如果队为空
if(isEmpty())
{
//如果为空的时候,没有第一个节点
//所以要先创建第一个节点
//new一个节点,然后rear和front都指向他
rear = new Entry(val);
front = rear;
}
else{
//当不为空的时候,有第一个节点
//入队的时候要入到队列的最后面及rear.next的位置
Entry entry = new Entry(val);
rear.next = entry;
//rear队尾要指向新的队尾
rear = entry;
}
size++;
}
/**
* 出队
* @return 数据
*/
public int pop()
{ //如果栈为空的时候直接返回-1
if(isEmpty()){
return -1;
}
//先获取数据
int val = front.data;
//队头向后移动,删去第一个元素,及出队
front = front.next;
//队的长度减1
size--;
return val;
}
/**
* 判断是否为空
* @return 是否为空
*/
public boolean isEmpty()
{
return size==0;
}
/**
* 得到队头
* @return
*/
public int getTop()
{ //如果为空返回-1
if(isEmpty()){
return -1;
}
//不为空返回队头的元素的数据
return front.data;
}
/**
* 输出当前队列的所有元素
*/
public void show()
{ //如果队列为空,什么都不执行
if(isEmpty()){
return;
}
//如果不为空,进行遍历,其方法和遍历单链表相同
Entry cur = front;
while(cur!=null)
{
System.out.print(cur.data+" ");
cur = cur.next;
}
System.out.println();
}
/**
* 将当前队列序列化为一个数组
* @return 当前队列的数组
*/
public int[] toArray()
{ //如果为队列空则返回null
if(isEmpty()){
return null;
}
//不为空的话进行遍历赋值
//将数据都存入新new的数组
Entry cur = front;
int[] a = new int[size];
int i = 0;
while(cur!=null)
{
a[i++] = cur.data;
cur = cur.next;
}
return a;
}
/**
* 获取当前队列长度
* @return
*/
public int getSize() {
return size;
}
}
测试
public static void main(String[] args) {
LinkQueue t = new LinkQueue();
for (int i = 0; i < 10; i++) {
t.Push(i);
}
t.show();
for (int i = 0; i < 11; i++) {
System.out.print(t.pop()+" ");
}
}
结果
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 -1
最后一个-1为过度出队返回的-1