2019-04-04 java数据结构(四) 队列
一、队列的理解
1、像就餐排队一样,先排队的先拿到饭。(先进先出)
2、代码实现的思想,存进去的数据放到最尾部;拿出来的数据,从头部开始拿起。
二、代码实现
1、队列的顺序存储结构方式:(数据都放在一个数组里面,方法的实现是对该数据进行操作)
public class ArrayQueue { private Object[] mArr; private int count; ArrayQueue(int size){ mArr=new Object[size]; count=0; } public void add(Object o){ if(count>=mArr.length ) throw new RuntimeException("队列已满,count="+count); mArr[count++]=o; } // 返回“队列顶端元素值”,并删除该“元素” public Object pop(){ if(isEmpty()) throw new RuntimeException("队列为空"); Object re=mArr[0]; count--; for (int i = 0; i < count; i++) { mArr[i]=mArr[i+1]; } return re; } //返回队列开头元素 public Object front(){ return mArr[0]; } public boolean isEmpty(){ return count==0?true:false; } public int size(){ return count; } }
2、队列的链式存储方式:(将存储的数据一个一个关联起来)
public class LinkQueue { private Node mHead;//链表头 private Node lastNode;//链表尾 private int curLen;//长度 LinkQueue(){ //表头始终是个空节点 mHead=new Node(); lastNode=new Node(); curLen=0; } //将元素加到链尾 public void add(Object o){ Node now=new Node(o,null); Node hNext=mHead; for (int i = 0; i <curLen; i++) { hNext=hNext.next; } hNext.next=now; curLen++; } //改善后的add方法,利用尾部节点 public void add2(Object o){ Node now=new Node(o,null); if(isEmpty()){ lastNode=now; mHead.next=lastNode; } else{ Node hNext=lastNode; hNext.next=now; lastNode=now; } curLen++; } // 返回“队列顶端节点”的值,从链头开始取值,并删除该“节点” public Object pop(){ if(isEmpty()) throw new RuntimeException("队列为空"); Node re=mHead.next; mHead.next=re.next; curLen--; return re.data; } //返回队列开头元素 public Object front(){ return mHead.next.data; } public boolean isEmpty(){ return curLen==0?true:false; } public int size(){ return curLen; } private static class Node{ private Object data; private Node next; public Node(){ this(null,null); } public Node(Object data,Node next){ this.data=data; this.next=next; } } }
3、代码测试:
//测试自制queue public static void demo5() throws Exception{ //顺序结构的queue ArrayQueue aq=new ArrayQueue(4); aq.add("i:1"); aq.add("i:2"); aq.add("i:3"); System.out.println(aq.pop()); System.out.println(aq.pop()); System.out.println(aq.pop()); System.out.println("-----------"); //链式结构的queue LinkQueue lq=new LinkQueue(); lq.add("i:1"); lq.add("i:2"); lq.add("i:3"); System.out.println(lq.pop()); System.out.println(lq.pop()); System.out.println(lq.pop()); }
控制台输出
i:1 i:2 i:3 ----------- i:1 i:2 i:3
三、过程总结
1、记住思想:存入数据放入头部,取出数据从尾部。(个人实现方法的思想不同,这个对我自己来说较合适)
2、先前有实现过“链式存储”,“顺序存储”,所以实现栈跟队列,都不算难。只要掌握“链式存储”,“顺序存储” 即可。
3、数据结构还是有必要自己亲手码一遍的。