队列的话,FIFO是其主要特性。
一、通过简单的链表来实现一个简单的单向队列。
主要包括两个方法:
put:加入元素导队列中去;
take:取出队头元素;
public interface MyQueue<T> { T take(); void put(T item); class Node<T>{ Node next; T item; public Node(T item){ this.item = item; this.next = null; } } }
实现类:
主要定义一下类元素:队头节点,队尾节点,队列大小。
put方法逻辑:
如果队列为空,则新元素就是队头(同时也是队尾);如果队列不为空,则尾插再队尾节点之后,作为新的队尾节点;
take方法逻辑:
如果对列为空,(所有节点被take出去)则返回队列无数据。
package study.queueStudy; public class MyQueueImpl<T> implements MyQueue<T>{ public static Node head; public static Node tail; public static int size; public MyQueueImpl(){ Node init = new Node(null); head = tail = init; size = 0; } @Override public T take() { Node currHead = head; if(currHead!=null&&size!=0){ T result = (T) currHead.item; head = currHead.next; System.out.print(result+"\n"); size--; return result; }else { throw new IllegalArgumentException("队列无数据"); } } @Override public void put(T item) { Node newNode = new Node(item); Node tailCurr = tail; Node headCurr = head; if(headCurr.item==null){ head.item=item; tail.item=item; size++; return; } tailCurr.next = newNode; tail = newNode; size++; } public static void main(String[] args) { MyQueueImpl myQueue = new MyQueueImpl(); myQueue.put(1); myQueue.put(2); myQueue.put(3); myQueue.put(4); myQueue.put(5); myQueue.put(6); myQueue.put(7); myQueue.put(8); myQueue.take(); myQueue.take(); myQueue.take(); myQueue.take(); myQueue.take(); myQueue.take(); myQueue.take(); } }
二、实现一个双向队列
双向队列和单向队列的差别主要在于可以从链表头插入,也可以从链表尾插入。