实现队列(单向+双向)

队列的话,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();
    }
}

二、实现一个双向队列

双向队列和单向队列的差别主要在于可以从链表头插入,也可以从链表尾插入。

猜你喜欢

转载自www.cnblogs.com/hekiraku/p/11990843.html