基于链表实现Java 自定义Queue队列

与栈一样,我们也可以借助单链表来实现队列ADT。同样地,出于效率方面的考虑,我们将以单链表的首(末)节点作为队列的首(末)节点。这样,可以回避单链表在尾部进行删除操作时效率低下的缺陷。此外,还需要两个实例变量分别指示表的首、末节点。

java代码如下:

QueueList:

package com.list.queue;
import java.util.Arrays;

import com.list.stack.Node;
import com.list.stack.ExceptionStackEmpty;

/**
 * 
 * @author gannyee
 *
 */
public class QueueList {

    //Declared head node
    private static Node head = new Node();
    //Declared rear node
    private static Node rear = new Node();
    //Declared size
    private static int size;
    //queue list
    private static int length;
    //Constructor initialize head, rear, size
    public QueueList(){
        head = rear = null;
        size = length = 0;
    }

    //Get size
    public int getSize(){
        return size;
    }

    //Get length
        public int length(){
            return length;
        }

    //Is empty
    public boolean isEmpty(){
        return size == 0;
    }

    //Enqueue element
    public void enqueue(Object element){
        Node newNode = new Node(element,head);
        if(getSize() == 0){
            head = newNode;
            rear = newNode;
        }
        head = newNode;
        size ++;
        length = size;
    }

    //Dequeue element
    public Object dequeue() throws ExceptionStackEmpty{
        if(isEmpty())
            throw new ExceptionStackEmpty("Queue is empty!");
        Node travelNode = new Node();
        travelNode = head;
        Object elementRear;
        while(travelNode != null){
            if(travelNode.getNext() == rear)
                break;
            travelNode = travelNode.getNext();
        }
        elementRear = rear.getElement();
        rear = travelNode;
        size --;
        return elementRear;
    }

    //Get head node but not delete
    public Object getHeadNode() throws ExceptionStackEmpty{
        if(isEmpty())
            throw new ExceptionStackEmpty("Queue is empty!");
        return head.getElement();
    }

    //Travel all node of queue
    public void getAllElement(){
        Node travelTop;
        travelTop = head;
        Object[] array = new Object[getSize()];

        for(int i = 0;i < array.length;i ++ ){
            array[i] = travelTop.getElement();
            travelTop = travelTop.getNext();
        }
        System.out.println("Get all elemnt: " + Arrays.toString(array));
    }

}

QueueListTest :

package com.list.queue;

import com.list.stack.ExceptionStackEmpty;

public class QueueListTest {

    public static void main(String[] args) throws ExceptionStackEmpty {
        // TODO Auto-generated method stub

        //Declared QueueList example
        QueueList ql = new QueueList();

        System.out.println("Size is: " + ql.getSize());
        System.out.println("Is empty? " + ql.isEmpty());

        ql.enqueue(12);
        ql.enqueue(32);
        ql.enqueue(35);
        ql.enqueue(12);
        ql.enqueue(34);
        ql.enqueue(45);
        ql.enqueue(17);
        ql.enqueue(2);
        ql.enqueue(15);

        System.out.println("Size is: " + ql.getSize());
        System.out.println("Is empty? " + ql.isEmpty());
        ql.getAllElement();


        for(int i = 0;i < ql.length();i ++)
            System.out.println(ql.dequeue());


        System.out.println("Size is: " + ql.getSize());
        System.out.println("Is empty? " + ql.isEmpty());
    }

}

测试结果:

Size is: 0
Is empty? true
Size is: 9
Is empty? false
Get all elemnt: [15, 2, 17, 45, 34, 12, 35, 32, 12]
12
32
35
12
34
45
17
2
15
Size is: 0
Is empty? true

与基于单链表实现的栈结构同理,如上实现的各个队列 ADT 方法都可以在 O(1)时间内完成。而且,这里同样无需限定队列的最大规模。当然,受单链表结构的限制,我们仍然需要对各种特殊情况(如队空时)专门处理。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,下面是一个简单的Java代码实现实现了一个自定义Queue接口,具有常见的队列操作方法: ```java public interface MyQueue<E> { boolean add(E e); boolean offer(E e); E remove(); E poll(); E element(); E peek(); int size(); boolean isEmpty(); boolean contains(Object o); boolean remove(Object o); void clear(); } ``` 接着是实现该接口的`MyLinkedQueue`: ```java public class MyLinkedQueue<E> implements MyQueue<E> { private Node<E> head; private Node<E> tail; private int size; private static class Node<E> { E item; Node<E> next; Node(E item) { this.item = item; } } public boolean add(E e) { Node<E> newNode = new Node<>(e); if (tail == null) { head = tail = newNode; } else { tail.next = newNode; tail = newNode; } size++; return true; } public boolean offer(E e) { return add(e); } public E remove() { if (head == null) { throw new NoSuchElementException(); } E item = head.item; head = head.next; if (head == null) { tail = null; } size--; return item; } public E poll() { return (head == null) ? null : remove(); } public E element() { if (head == null) { throw new NoSuchElementException(); } return head.item; } public E peek() { return (head == null) ? null : element(); } public int size() { return size; } public boolean isEmpty() { return (head == null); } public boolean contains(Object o) { for (Node<E> node = head; node != null; node = node.next) { if (o == null) { if (node.item == null) { return true; } } else { if (o.equals(node.item)) { return true; } } } return false; } public boolean remove(Object o) { Node<E> prev = null; for (Node<E> node = head; node != null; prev = node, node = node.next) { if (o == null) { if (node.item == null) { unlink(prev, node); return true; } } else { if (o.equals(node.item)) { unlink(prev, node); return true; } } } return false; } public void clear() { for (Node<E> node = head; node != null; ) { Node<E> next = node.next; node.item = null; node.next = null; node = next; } head = tail = null; size = 0; } private void unlink(Node<E> prev, Node<E> node) { if (prev == null) { head = node.next; } else { prev.next = node.next; } if (tail == node) { tail = prev; } size--; } } ``` 上述代码实现了一个基于链表队列`MyLinkedQueue`,它是`MyQueue`接口的实现,在这里我们也使用了内部`Node`来表示队列中的每个元素节点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值