标签:code 解决 queue 线性表 href 空间 system 效率 生活
队列(Queue) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
队列的特点就是:先进先出,和生活中排队的例子是很先进的,排队的目的不就是先到先得吗。
生活中的队列相当于顺序存储的队列,在火车站排队买票,前面的人买完票走了,后面的人一个一个往前移一位,这是很正常的事情,而计算机中队列队列第一个元素出去了,后面的元素一个一个往前移,这是一件很降低效率的一件事。为了解决这种效率问题,计算机采用循环队列的方式操作队数据。
循环队列
队列的头尾相接的顺序存储结构称为循环队列。
1.首先循环队列依旧是顺序存储结构:在内存中开辟一段连续的空间,头指针和为指针重合,也就是front==rear。
2.入队的时候排在最后一个元素的后面,也就是每次放在rear所指的位置,然后rear指向后面的位置
3.出队情况是队列最前一个元素出队,与顺序存储的区别是其他元素不需要往前移位,而是每个元素还在自己的位置上,只是指向对头的指针指向现在的对头
4.那循环队列是如何实现循环的呢,如下图,当后面没有地方放元素,就可以从前面在开始放元素,front指向的仍然是对头,rear执行的仍然是队尾;即每次入队的时候,rear不是要指向后面一个位置吗,通过rear=(rear+1)%QueueSize来实现,就能达到循环。
5.怎么判断队满?
当(rear+1)%QueueSize==front时,就说明队满了,也就是rear不能再往后退了,再退就与front重合了。因为rear==front的时候是空队列,为了与空队列区分开,让rear指向front前一个位置的时候规定为队满情况。
Java实现队列数据结构
package com.neuedu.roundQuery; /* * 项目名称:JavaQuery * @author:wzc * @date 创建时间:2017年9月9日 下午2:45:24 * @Description:循环队列 * @parameter * */ public class RoQueue { public static int QueueSize=10; public int date[]=new int[QueueSize]; public int front; public int rear; public RoQueue() { front=0; rear=0; } ///判断队列是否为空 public boolean isEmpty(){ if(front==rear){ return true; } return false; } //判断队列是否满; public boolean isFull(){ if ((rear+1)%QueueSize==front) { return true; } return false; } //入队操作 public void add(int date){ //判断队列是否为满 if (isFull()) { System.out.println("队列已满"); return; }else{ this.date[rear]=date; rear=(rear+1)%QueueSize; System.out.println(date+"加入队列"); } } //出队操作 public int delete(){ int date=0; //判断队列是否为空 if (isEmpty()) { System.out.println("队列中已没有数据"); return -1; }else{ date=this.date[front]; front=(front+1)%QueueSize; System.out.println(date+"出队"); return date; } } //获取队列中当前数据个数 public int getLength(){ //获取数据个数 return(rear-front+QueueSize)%QueueSize; } //获取队列中的第几个数 public int getIndexDate(int index){ int length = getLength(); if (index>=0&&index<length) { return date[front+index]; } return -1; } //输出队列中的所有数 public void getDate(){ int length = getLength(); for(int i=0;i<length;i++){ System.out.print(date[front+i]+" "); } System.out.println(); } }
链式存储队列
链式存储队列实际就是单链表,只不过呢只能先进先出而已,也就是每次只能删除队头结点,只能在队尾结点后面插入新结点
入队
出队
代码实现可以参照单链表。
标签:code 解决 queue 线性表 href 空间 system 效率 生活
原文地址:http://www.cnblogs.com/Actexpler-S/p/7498617.html