写在前面:
上一篇文章中我们聊到了栈——漫画趣解什么是栈?
相信很多小伙伴都理解了栈;
那么这次,同样采用漫画形式,给大家聊一聊什么是队列;
思维导图:
什么是队列?
队列是一种受限的线性表;
队列只允许在一端进行插入操作,另一端进行删除操作;
队列的特性?
允许插入的一端叫队尾,允许删除的的一端叫队头;
即先进先出,后进后出;
队列的存储结构:
代码实现:
文中完整源码获取请关注公众号《程序员的时光》;
后台回复——数据结构源码,可以获得常见数据结构代码;
队列的顺序存储:
方法类:
//入队
public void Push_SeqQueue(SeqQueue queue, Object data){
if(queue==null){
return;
}
if(data==null){
return;
}
//如果队列容量小于或等于数组容量
if(queue.size==Max_Size){
return;
}
//元素入队
queue.data[queue.size]=data;
queue.size++;
}
//返回队头元素
public Object Front_SeqQueue(SeqQueue queue){
if(queue==null){
return null;
}
if(queue.size==0){
return null;
}
//队头元素下标为0
return queue.data[0];
}
//出队
public void Pop_SeqQueue(SeqQueue queue){
if(queue==null){
return;
}
if(queue.size==0){
return;
}
//出队操作需要移动全部元素
for (int i = 0; i < queue.size-1; i++) {
queue.data[i]=queue.data[i+1];
}
queue.size--;
}
主函数:
public static void main(String[] args) {
SeqQueueDao seqQueueDao=new SeqQueueDao();
//初始化队列
SeqQueue queue=seqQueueDao.Init_SeqQueue();
//入队
seqQueueDao.Push_SeqQueue(queue,"A");
seqQueueDao.Push_SeqQueue(queue,"B");
seqQueueDao.Push_SeqQueue(queue,"C");
seqQueueDao.Push_SeqQueue(queue,"D");
seqQueueDao.Push_SeqQueue(queue,"E");
//出队
while (queue.size>0){
//查找队头元素
Object o=seqQueueDao.Front_SeqQueue(queue);
System.out.println(o);
//出队
seqQueueDao.Pop_SeqQueue(queue);
}
}
运行结果:
队列的链式存储:
方法类:
//入队列
public void Push_LinkQueue(LinkQueue queue,Object data){
if (queue == null){
return;
}
if (data == null){
return;
}
//创建新插入的结点,也就是队列顶指针后面的第一个元素,因为只能在队列顶进行元素插入或删除
LinkQueueNode newNode=new LinkQueueNode(data,null);
//进入插入操作
newNode.next=queue.head.next;
//队列顶指针的next等于新插入结点
queue.head.next=newNode;
//队列容量加1
queue.size++;
}
//出队列
public void Pop_LinkQueue(LinkQueue queue){
if (queue == null){
return;
}
if (queue.size == 0){
return;
}
//pPrev指头结点,pCurrent指头结点后面的第一个元素,直到pCurrent为空为止
LinkQueueNode pPrev=queue.head;
LinkQueueNode pCurrent=pPrev.next;
while (pCurrent.next!=null){
pPrev=pCurrent;
pCurrent=pPrev.next;
}
pPrev.next=null;
//队列容量减1
queue.size--;
}
//返回队头元素
public Object Front_LinkQueue(LinkQueue queue){
if (queue == null){
return null;
}
if (queue.size == 0){
return null;
}
//队头元素也就是前面插入的元素,采用循环一直找到队头元素
LinkQueueNode pCurrent=queue.head;
while (pCurrent.next!=null){
pCurrent=pCurrent.next;
}
return pCurrent.data;
}
主函数:
public static void main(String[] args) {
LinkQueueDao linkQueueDao=new LinkQueueDao();
//初始化队列
LinkQueue queue=linkQueueDao.Init_LinkQueue();
//入队列
linkQueueDao.Push_LinkQueue(queue,"A");
linkQueueDao.Push_LinkQueue(queue,"B");
linkQueueDao.Push_LinkQueue(queue,"C");
linkQueueDao.Push_LinkQueue(queue,"D");
linkQueueDao.Push_LinkQueue(queue,"E");
//输出队列元素
while(!linkQueueDao.IsEmpty_LinkQueue(queue)){
//查找队头元素
Object o=linkQueueDao.Front_LinkQueue(queue);
System.out.println(o);
//出队列
linkQueueDao.Pop_LinkQueue(queue);
}
}
运行结果:
好了,今天就先分享到这里了,下期给大家带来树的讲解!
**原创实属不易,求个关注吧~**