数据结构java(九)受限制的线性表 ②链式结构实现(双向链表实现队列LinkedQueue)

1.双向链表实现队列LinkedQueue实现

/**
 * 双向链表实现队列
 * @author Administrator
 */
public class LinkedQueue implements Queue {
    /**
     * 链表的结点个数
     */
    private int size;

    /**
     * 首结点
     */
    private Node first = new Node(null,null,null);

    /**
     * 尾结点
     */
    private Node last = new Node(null,null,null);

    /**
     * 初始化双向链表
     */
    public LinkedQueue() {
        this.first.next=last;
        this.last.prev=first;
        this.size = 0;
    }


    /**
     * 返回队列大小
     *
     * @return
     */
    @Override
    public int getSize() {
        return size;
    }

    /**
     * 判断队列是否为空
     *
     * @return
     */
    @Override
    public boolean isEmpty() {
        return size==0;
    }

    /**
     * 数据元素e入队
     *
     * @param e
     */
    @Override
    public void enqueue(Object e) {
        //新创建一个结点
        Node newNode  = new Node(null,e,null);
        Node p = last;
        newNode.prev=p.prev;
        newNode.next=p;
        p.prev.next=newNode;
        p.prev=newNode;
        size++;
    }

    /**
     * 队首元素出队
     *
     * @return
     */
    @Override
    public Object dequeue() {
        if (size==0){
            throw new MyArrayIndexOutOfBoundsException("空栈");
        }
        //删除的前一个结点
        Node prev = first;
        //删除的结点
        Node deleteNode = first.next;
        //删除的后一个结点
        Node next = deleteNode.next;
        //删除操作
        prev.next=next;
        next.prev=prev;
        deleteNode.prev=null;
        deleteNode.next=null;
        //数量-1
        size--;
        return deleteNode;
    }

    /**
     * 所有元素出队
     */
    @Override
    public void dequeueAll() {
        if (size == 0){
            throw new MyArrayIndexOutOfBoundsException("空栈");
        }
        StringBuilder builder = new StringBuilder("[");
        for (int i = size;i>0;i--){
            if (i!=1){
                builder.append(dequeue()+",");
            }else {
                builder.append(dequeue());
            }
        }
        builder.append("]");
        System.out.println(builder);
    }

    /**
     * 取队首元素
     *
     * @return
     */
    @Override
    public Object peek() {
        if (size==0){
            throw new MyArrayIndexOutOfBoundsException("空栈");
        }
        return first.next;
    }



    class Node {
        /**
         * 表示该节点包含的值
         */
        private Object object;
        /**
         * 表达当前节点的下一个节点
         */
        private Node next;
        /**
         * 表示当前节点的上一个节点
         */
        private Node prev;
        /**
         *
         * @param prev 上一个节点
         * @param element 当前节点
         * @param next 下一个节点
         */
        public Node(Node prev, Object object, Node next) {
            this.object = object;
            this.next = next;
            this.prev = prev;
        }

        @Override
        public String toString() {
            return "Node{" +
                    "object=" + object+
                    '}';
        }
    }

    //[0,1,2,3,4,5]
    @Override
    public String toString() {
        if (size == 0){
            return "[]";
        }
        StringBuilder builder = new StringBuilder("[");
        Node p = first.next;
        for (int i = 0;i<size;i++){
            if (i!=size-1){
                builder.append(p.object+",");
            }else {
                builder.append(p.object);
            }
            //移动到下一个结点
            p=p.next;
        }
        builder.append("]");
        return builder.toString() ;
    }
}

2.测试

/**
 * 测试
 * @author Administrator
 */
public class LinkedQueueTest {
    private Queue queue;
    @Before
    public void setUp() throws Exception {
        queue = new LinkedQueue();
        queue.enqueue(1);
        queue.enqueue(2);
        queue.enqueue(3);
        System.out.println("操作前:"+queue+"大小:"+queue.getSize());
    }

    @After
    public void tearDown() throws Exception {
        System.out.println("操作后:"+queue+"大小:"+queue.getSize());
    }

    @Test
    public void enqueue() {
        queue.enqueue(4);
        queue.enqueue(5);
        queue.enqueue(6);
    }

    @Test
    public void dequeue() {
        System.out.println(queue.dequeue());
        queue.enqueue(4);
        queue.enqueue(5);
        queue.enqueue(6);
        System.out.println(queue.dequeue());
        queue.dequeueAll();
    }

    @Test
    public void dequeueAll() {
        queue.dequeueAll();
    }

    @Test
    public void peek() {
        System.out.println(queue.peek());
    }
}

下一篇:数据结构java(十)二叉树①链式结构实现(LinkedBinaryTree)

/* * 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected int size;//队列中元素的数目 //构造函数 public Deque_DLNode() { header = new DLNode(); trailer = new DLNode(); header.setNext(trailer); trailer.setPrev(header); size = 0; } //返回队列中元素数目 public int getSize() { return size; } //判断队列是否为空 public boolean isEmpty() { return (0 == size) ? true : false; } //取首元素(但不删除) public Object first() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return header.getNext().getElem(); } //取末元素(但不删除) public Object last() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return trailer.getPrev().getElem(); } //在队列前端插入新节点 public void insertFirst(Object obj) { DLNode second = header.getNext(); DLNode first = new DLNode(obj, header, second); second.setPrev(first); header.setNext(first); size++; } //在队列后端插入新节点 public void insertLast(Object obj) { DLNode second = trailer.getPrev(); DLNode first = new DLNode(obj, second, trailer); second.setNext(first); trailer.setPrev(first); size++; } //删除首节点 public Object removeFirst() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = header.getNext(); DLNode second = first.getNext(); Object obj = first.getElem(); header.setNext(second); second.setPrev(header); size--; return(obj); } //删除末节点 public Object removeLast() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = trailer.getPrev(); DLNode second = first.getPrev(); Object obj = first.getElem(); trailer.setPrev(second); second.setNext(trailer); size--; return(obj); } //遍历 public void Traversal() { DLNode p = header.getNext(); while (p != trailer) { System.out.print(p.getElem()+" "); p = p.getNex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值