java数据结构队列
‘壹’ java数据结构之何为队列
java是一门面向对象的语言,但是也要用到数据结构的,比如让你求个迷宫出口
‘贰’ 高手请帮忙用java版的数据结构,设置3个队列,实现入队出队。
import java.util.ArrayList;
/**
*
* @author 狱韬
*/
public class SnakeBody {
private int size=0; //队列的长度
private int cursor=-1; //指针
private ArrayList<int[]> list=null; //存储器
public SnakeBody() {
list=new ArrayList<int[]>(); //存储器
}
//返回底部的数据
public int[] getLast(){
return list.get(list.size()-1);
}
//返回顶部的数据
public int[] getFirst(){
return list.get(0);
}
//压入数据
public void put(int[] arry){
list.add(arry);
}
//删除底部数据
public void removeLast(){
list.remove(list.size()-1);
}
//重置
public void reSet(){
list=new ArrayList<int[]>(); //存储器
}
//删除顶部数据
public void removeFirst(){
list.remove(0);
}
//返回数据长度
public int size(){
return list.size();
}
public static void main(String[] args) {
SnakeBody data = new SnakeBody();
for(int i=0;i<10;i++){
data.put(new int[]{0,i});
}
System.out.println(data.getFirst()[0]+"-------"+data.getFirst()[1]);
System.out.println(data.getLast()[0]+"-------"+data.getLast()[1]);
data.removeLast();
System.out.println(data.getFirst()[0]+"-------"+data.getFirst()[1]);
System.out.println(data.getLast()[0]+"-------"+data.getLast()[1]);
}
}
‘叁’ java常用的几种数据结构,堆栈,队列,数组,链
下面给你简单介绍:堆栈,队列,数组,链表
堆栈
采用该结构的集合,对元素的存取有如下的特点:
先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。
栈的入口、出口的都是栈的顶端位置
压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。
队列
采用该结构的集合,对元素的存取有如下的特点:
先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如,安检。排成一列,每个人依次检查,只有前面的人全部检查完毕后,才能排到当前的人进行检查。队列的入口、出口各占一侧。
数组
采用该结构的集合,对元素的存取有如下的特点:
查找快:通过索引,可以快速访问指定位置的元素
增删慢:
指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。
链表
采用该结构的集合,对元素的存取有如下的特点:
多个节点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次类推,这样多个人就连在一起了。
节点:两个部分:数据域(存储的数值),指针域(存储地址)
查找慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
增删快:
增加元素:操作如左图,只需要修改连接下个元素的地址即可。
删除元素:操作如右图,只需要修改连接下个元素的地址即可。
‘肆’ java中的“queue类”是什么,有什么作用
java中的queue类是队列数据结构管理类。在它里边的元素可以按照添加它们的相同顺序被移除。
队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。无论使用哪种排序方式,队列的头都是调用remove()或poll()所移除的元素。在 FIFO 队列中,所有的新元素都插入队列的末尾。其他种类的队列可能使用不同的元素放置规则。每个Queue实现必须指定其顺序属性。
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个
NoSuchElementException异常
注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的。
还有带超时的offer和poll方法重载,例如,下面的调用:
boolean success = q.offer(x,100,TimeUnit.MILLISECONDS);
尝试在100毫秒内向队列尾部插入一个元素。如果成功,立即返回true;否则,当到达超时进,返回false。同样地,调用:
Object head = q.poll(100, TimeUnit.MILLISECONDS);
如果在100毫秒内成功地移除了队列头元素,则立即返回头元素;否则在到达超时时,返回null。
阻塞操作有put和take。put方法在队列满时阻塞,take方法在队列空时阻塞。
Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。BlockingQueue 继承了Queue接口。
‘伍’ java 新手 数据结构中 数组 ,栈 ,队列, 链表, 树 ,图 , 堆, 散列表 他们之间存在那种关系啊
他们都是一种存储数据的方式而已,打个比方,你坐地铁1号线上班和2号线上班,都能上班只是路线不一样,他们都是存储数据的格式,每种数据结构有自己的特点,使用哪种数据格式需要根据具体的需求来选,比如你现在需要有序的存储一组数据而且还要经常的查询数据,那么数组就是最合适的,他有角标可以很容易进行排序和查询!如果有序但是经常增删数据,那么链表就是最合适的,他的增删很快,但是查询差。每种数据结构有各自的适用条件,根据需求来选择具体的数据结构,时间久了不需要记忆你都会用了
‘陆’ 数据结构:关于Java实现的一个队列,对其中的扩容步骤有疑问答题的都是我爹
这确实有点奇葩,要么修改resize方法,在进行复制的时候,先判断一下front和rear的值,如果front不为0,说明进行过出队列操作,再判断rear与front的值:
if(front<rear){//fromfronttorear这样就可以去除多余的空位置,让front从0开始}
if(front>rear){
//先复制后半段到新的数组,然后复制前半段到新数组的后面,这就保证0位置的就是队列的头
}
这样的话,就可以理解为什么resize之后将front置为0,。
不知道这样的解释对不对,我看完上面的代码觉得就是这样的。
‘柒’ 在Java数据结构中的布线问题,用队列和栈都可以找到解,但是队列可以找到最优解,栈不一定能,分析其原因
因为队列实际上进行的是广度优先,求得的是最短距离,也就是最优解
如果用栈得到的一般都不能保证是最短距离,自然也不一定是最优解了
‘捌’ 简述队列和栈的不同,以及在java语言中如何实现这两个数据结构
队列形似一水管左右都互通,所以先进入的数据从另一头先出来。栈形似一个水杯,先进去的肯定被压在最下面。后进去的肯定在最上面。所以先进去肯定后最后出来。后进去的肯定最先出来。理解这个。你去看相关的代码没问题!
‘玖’ java版数据结构如何创建一个循环队列
public class CircleQueue<T> {
private int maxSize;
private int head;//头部出 始终指向即将被取出的下标
private int tail;//尾部进 始终指向即将赋值的下标
private int size;
//tail和head在队列为空或为满的时候重合,用size是否为0来区分
private Object[] array;
public CircleQueue(int maxSize){
this.maxSize=maxSize;
array=new Object[this.maxSize];
}
public synchronized boolean put(T t){
if(size<maxSize){
array[tail]=t;
tail=(tail+1)%maxSize;
size++;
return true;
}else{
return false;
}
}
public synchronized T take(){
if(size>0){
T t=(T) array[head];
head=(head+1)%maxSize;
size--;
return t;
}else{
return null;
}
}
public int size(){
return size;
}
}
‘拾’ java 数据结构 队列的基本应用 合并,复制,检查是否相同
楼主,你先把Queue 的方法实现,我们才知道怎么搞!题目的意思估计就是说要通过这几个方法来实现下面的功能,但你这几个方法的什么信息都没给,实在没办法解答!