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、数据结构还是有必要自己亲手码一遍的。

posted @ 2019-04-04 14:16  math_lin  阅读(216)  评论(0编辑  收藏  举报