• Java之使用链表实现队列


    import java.util.Iterator;
    import java.util.NoSuchElementException;

    /**
     * 使用链表来实现队列
     *  1.考虑结点的结构,包括当前结点的元素和模拟的指针指向下一个元素
     *  2.结点的结构使用内部类来进行设计
     *  3.队列的结构:队列的长度,队列的首节点,队列的尾结点
     *  4.考虑队列需要的操作:
     *      1.使用构造函数进行初始化
     *      2.判断队列是否为空
     *      3.返回队列的长度
     *      4.向队列尾部中添加元素
     *      5.将队列首部元素删除
     *      6.格式化输出
     *      7.迭代器遍历
     * @author WZLOVE
     * @create 2018-07-14 18:03
     */
    public class LinkedQueue<Item> implements Iterable<Item> {
    
        /**
         * 定义队列基本元素
         */
    
        /**
         *  队列的长度
         */
        private int n;
        /**
         * 队列的首节点
         */
        private Node first;
        /**
         * 队列的尾节点
         */
        private Node last;
    
        /**
         *  定义结点类
         */
        private class Node{
            private Item item;
            private Node next;
        }
    
    
        /**
         * 使用构造方法初始化队列
         * @return
         */
        public LinkedQueue() {
            this.first = null;
            this.last = null;
            n = 0;
            assert check();
        }
    
        /**
         * 判空
         * @return
         */
        public boolean isEmpty(){
            // 如果对头为null,则表示队列为空
            return first == null;
        }
    
        /**
         * 求队列的长度
         * @return
         */
        public int size(){
            return n;
        }
    
        /**
         * 获取对头的元素
         * @return
         */
        public Item peek(){
            if(isEmpty()){
                throw new NoSuchElementException("队列为空,没有元素");
            }
            return first.item;
        }
    
        /**
         * 添加元素
         * @return
         */
        public void addQueue(Item item){
            Node oldNode = last;
            last = new Node();
            last.item = item;
            last.next = null;
            if(isEmpty()){
                first = last;
            } else{
                oldNode.next = last;
            }
            n ++;
            assert check();
        }
    
        /**
         * 删除元素
         * @return
         */
        public Item deQueue(){
            if(isEmpty()){
                throw new NoSuchElementException("队列为空,不能进行该操作");
            }
            Item item = first.item;
            first = first.next;
            n --;
            if(isEmpty()){
                last = null;
            }
            assert check();
            return item;
        }
    
        @Override
        public String toString() {
            StringBuilder sb = new StringBuilder();
            for(Item item : this){
                sb.append(item + " ");
            }
            return sb.toString();
        }
    
        /**
         * 返回迭代器
         * @return
         */
        @Override
        public Iterator<Item> iterator() {
            return new ListIterator();
        }
    
        /**
         * 实现迭代器接口
         */
        private class ListIterator implements Iterator<Item> {
            /**
             * 队首的元素
             */
            private Node current = first;
    
            /**
             * 判断有无更多元素
             * @return
             */
            @Override
            public boolean hasNext()  { return current != null;                     }
            @Override
            public void remove()      { throw new UnsupportedOperationException();  }
    
            /**
             * 返回当前元素,移动指针(这样理解就好,实际java中无指针)
             * @return
             */
            @Override
            public Item next() {
                if (!hasNext()) throw new NoSuchElementException();
                Item item = current.item;
                current = current.next;
                return item;
            }
        }
    
        /**
         *检查队列的结构是否符合要求
         * @return
         */
        private boolean check() {
            if (n < 0) {
                return false;
            }
            else if (n == 0) {
                if (first != null) return false;
                if (last  != null) return false;
            }
            else if (n == 1) {
                if (first == null || last == null) return false;
                if (first != last)                 return false;
                if (first.next != null)            return false;
            }
            else {
                if (first == null || last == null) return false;
                if (first == last)      return false;
                if (first.next == null) return false;
                if (last.next  != null) return false;
    
                // check internal consistency of instance variable n
                int numberOfNodes = 0;
                for (Node x = first; x != null && numberOfNodes <= n; x = x.next) {
                    numberOfNodes++;
                }
                if (numberOfNodes != n) return false;
    
                // check internal consistency of instance variable last
                Node lastNode = first;
                while (lastNode.next != null) {
                    lastNode = lastNode.next;
                }
                if (last != lastNode) return false;
            }
    
            return true;
        }
    
        public static void main(String[] args) {
            LinkedQueue<String> linkedQueue = new LinkedQueue<>();
            linkedQueue.addQueue("迪丽热巴");
            linkedQueue.addQueue("杨紫");
            linkedQueue.addQueue("李溪芮");
            Iterator<String> it = linkedQueue.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
    
            System.out.println("============================================================");
            System.out.println("队列中有" + linkedQueue.size()  + "个元素");
            System.out.println("============================================================");
            System.out.println(linkedQueue);
        }
    }
  • 相关阅读:
    C# 获取文件名、无后缀文件名、扩展名
    navicat for oracle 导入xlsx文件提示无法打开xlsx文件
    复制的文件不能粘贴到远程的服务器上
    使用.bat 批量将部分文件迁移到新的路径下
    sql sever 查询用户所有的表和各个表数据量
    orecle 查询数量 union合并 的排序问题
    oracle 如何将带有,的一列分成多列
    java中selenium判断某个元素是否存在
    docker安装Ubuntu以及ssh连接
    Java8 将List<JavaBean>中某个属性取出来为单独的一个集合List<String>
  • 原文地址:https://www.cnblogs.com/wadmwz/p/9311077.html
Copyright © 2020-2023  润新知