zoukankan      html  css  js  c++  java
  • 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、数据结构还是有必要自己亲手码一遍的。

  • 相关阅读:
    MySQL中的while循环和repeat循环的区别
    Python 基础语法_Python脚本文件结构
    Python 基础语法_Python脚本文件结构
    MySQL存储过程和函数的区别
    第四章 语句和声明
    haproxy 4层和7层负载
    献血是件很赞的事——北漂18年(26)
    JavaScript字符串数值比较问题
    MySQL查看所有可用的字符集
    MySQL获取表格信息
  • 原文地址:https://www.cnblogs.com/mathlin/p/10654595.html
Copyright © 2011-2022 走看看