之前写的另一篇文章关于循环队列的:
https://blog.csdn.net/qq_44871442/article/details/96639915
链队列
链队列,用链式存储结构来存储队列中的数据元素,一般采用单链表来表示,设队头指示器为front,队尾指示器rear。
这里的一个结点,简单的来说就包含两个部分,一个是数据域,用来存放存储的数据;另一个是“指针域”,用来指向下一个结点。
结点表示如下:
public class QueueNode<E>{
private E data; //数据类型为Object
private QueueNode next;
}
private QueueNode front; //队头”指针“
private QueueNode root; //队尾”指针“
一.链队的要素
链队列有两个特殊的状态和操作!
(1)两个状态
1)队空状态
2)队满状态
不存在队列满的情况(假设内存无限大的情况下不存在)
(2)两个操作
1)元素进队操作
2)元素出队操作
二.算法实现
public class QueueL<E>{
//链结点
public class QueueNode<E>{
private E data;
private QueueNode next;
}
private QueueNode front;
private QueueNode rear;
private int size;
//初始化操作
public void initQueue()
{
this.size = 0;
front = rear = null;
}
//判队空
public boolean judgeEmpty() {
if ((front == rear) && (size == 0)) {
return true;
} else {
return false;
}
}
//入队列
public void addNode(E x)
{
QueueNode node = new QueueNode();
node.data = x;
if(!judgeEmpty()){
rear.next = node;
rear = node;
size++;
}
else
{
front = node;
rear = node;
size++;
}
}
//出队列
public E pop()
{
if(!judgeEmpty()){
QueueNode node = front;
front = node.next;
size--;
if(front ==null)//只有一个元素
{
rear=null;
}
return (E) node.data;
}
else
return null;
}
public static void main(String[] args) {
QueueL p = new QueueL();
p.initQueue();
long start=System.currentTimeMillis(); //获取开始时间
for(int i = 0;i<1000;i++)
{
p.addNode(i);
}
System.out.println("the number of elements:"+p.size);
for(int i = 0;i<800;i++)
{
if(i%300==0){
System.out.print(p.pop()+",");}
}
long end=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(end-start)+"ms");
}
}
运行结果:(这里修改了参数i,使元素数目增多,以看到运行时间变化)
至此链队列和顺序队列的基本操作都已经实现,大家还可以继续探索,队列只是一种数据结构,相关性质也是我们自己规定的,比如:先进先出,大家可以实现更多的功能,使之成为不一样的**“队列”**。
链队列、顺序队列各有优缺点,大家可以更深入的去了解,并且可以利用代码跑一跑,测一测运行时间,充分了解各自利弊,以便今后更恰当地选择相应结构去实现。