Java之使用链表实现队列

匿名 (未验证) 提交于 2019-12-02 21:53:52

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);     } }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!