#数据结构--基于双端链表实现双端队列

4.8.3.5 源码
package com.yzh.maven.entity;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.yzh.maven.base.abstracts.MyQueueAbstract;
import com.yzh.maven.base.dao.MyDequeDao;
import com.yzh.maven.base.dao.MyIterator;
import com.yzh.maven.utils.SingletonUtils;

/**

  • @className MyHeadLastLinkedDeque

  • @description 基于链表实现双端队列

  • @author yzh

  • @date 2019-04-21

  • @param
    */
    public class MyHeadLastLinkedDeque extends MyQueueAbstract implements MyDequeDao{
    @SuppressWarnings(“rawtypes”)
    private MyHeadLastList headLastListDueue;
    private int size;
    private int modCount;

    public MyHeadLastLinkedDeque(){
    headLastListDueue = SingletonUtils.getMyHeadLastListSingleton();
    }

    /***

    • @functionName:size
    • @description:队列的大小
    • @author yzh
    • @date 2019-04-13
    • @return int
      */
      public int size(){
      return size;
      }

    /////////////////////////////////////queue////////////////////////////////////
    /***

    • @functionName:add
    • @description:实现元素的添加。
    • @param e
    • @author yzh
    • @date 2019-04-13
    • @return boolean
      /
      public boolean add(E e) {
      this.addLast(e);
      return true;
      }
      /
      **
    • @functionName:offer
    • @description:用于实现元素的添加。入队成功返回true,否则返回false,即如果队列已满直接返回false,队列未满则直接插入并返回true。
    • @param e
    • @author yzh
    • @date 2019-04-13
    • @return boolean
      */
      public boolean offer(E e) {
      return this.offerLast(e);
      }

    /***

    • @functionName:remove
    • @description:方法直接删除队头的元素。
    • @author yzh
    • @date 2019-04-13
    • @return E
      */
      public E remove() {
      return this.removeLast();
      }

    /***

    • @functionName:poll
    • @description:方法取出并删除队头的元素,当队列为空,返回null。
    • @author yzh
    • @date 2019-04-13
    • @return E
      */
      public E poll() {
      return this.pollLast();
      }

    /***

    • @functionName:peek
    • @description:方法直接取出队头的元素,并不删除。
    • @author yzh
    • @date 2019-04-13
    • @return E
      */
      public E peek() {
      return this.getFirst();
      }

    /***

    • @functionName:isEmpty
    • @description:判断队列是否为空
    • @author yzh
    • @date 2019-04-13
    • @return boolean
      */
      public boolean isEmpty(){
      return size == 0;
      }

    ///////////////////////////////////////deque/////////////////////////////////////
    /***

    • @functionName:addFirst
    • @description:从对头添加元素
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public void addFirst(E e) {
      if (e == null){
      throw new NullPointerException();
      }
      headLastListDueue.addByHead(e);
      modCount++;
      size++;
      }

    /***

    • @functionName:addLast
    • @description:从对尾添加元素
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public void addLast(E e) {
      if (e == null){
      throw new NullPointerException();
      }
      headLastListDueue.addByLast(e);
      modCount++;
      size++;
      }

    /***

    • @functionName:offerFirst
    • @description:从队列的开头实现元素的添加。入队成功返回true
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @Override
      public boolean offerFirst(E e) {
      addFirst(e);
      return true;
      }

    /***

    • @functionName:offerLast
    • @description:从队列的末尾实现元素的添加。入队成功返回true
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @Override
      public boolean offerLast(E e) {
      addLast(e);
      return false;
      }

    /***

    • @functionName:removeFirst
    • @description:从队头实现元素的删除
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @Override
      public E removeFirst() {
      //方法取出并删除队头的元素,当队列为空,返回null。
      E e = pollFirst();
      //如果元素为空,那么抛出空指针异常
      if(e == null){
      throw new NullPointerException();
      }
      return e;
      }

    /***

    • @functionName:removeLast
    • @description:从队尾实现元素的删除
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @Override
      public E removeLast() {
      //方法取出并删除队尾的元素,当队列为空,返回null。
      E e = pollLast();
      //如果元素为空,那么抛出空指针异常
      if(e == null){
      throw new NullPointerException();
      }
      return e;
      }

    /***

    • @functionName:pollFirst
    • @description:取出并删除队头的元素,当队列为空,返回null
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public E pollFirst() {
      //如果队列为空,那么返回null
      if(isEmpty()){
      return null;
      }
      //获取对头元素
      E e = (E) headLastListDueue.getHead();
      //删除对头元素
      headLastListDueue.deleteByHead();
      modCount++;
      size–;
      return e;
      }

    /***

    • @functionName:pollLast
    • @description:取出并删除队尾的元素,当队列为空,返回null
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public E pollLast() {
      //如果队列为空,那么返回null
      if(isEmpty()){
      return null;
      }
      //获取尾元素
      E e = (E) headLastListDueue.getLast();
      //删除对尾元素
      headLastListDueue.deleteByLast();
      modCount++;
      size–;
      return e;
      }

    /***

    • @functionName:getFirst
    • @description:取出但不删除队头的元素,当队列为空,抛出异常
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public E getFirst() {
      //如果队列为空,那么抛出异常
      if(isEmpty()){
      throw new RuntimeException(“this dueue is null!”);
      }
      return (E) headLastListDueue.getHead();
      }

    /***

    • @functionName:getLast
    • @description:取出但不删除队尾的元素,当队列为空,抛出异常
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public E getLast() {
      //如果队列为空,那么抛出异常
      if(isEmpty()){
      throw new RuntimeException(“this dueue is null!”);
      }
      return (E) headLastListDueue.getLast();
      }

    /***

    • @functionName:peekFirst
    • @description:取出队头的元素,并不删除
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public E peekFirst() {
      return (E) headLastListDueue.getHead();
      }

    /***

    • @functionName:peekLast
    • @description:取出队尾的元素,并不删除
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public E peekLast() {
      return (E) headLastListDueue.getLast();
      }

    ///////////////////////////////////Stack///////////////////////////////////////
    /***

    • @functionName:push
    • @description:入栈操作
    • @author yzh
    • @date 2019-04-20
    • @return
      */
      @Override
      public void push(E e) {
      this.addLast(e);
      }

/***

  • @functionName:pop

  • @description:出栈操作

  • @author yzh

  • @date 2019-04-20

  • @return E
    /
    @Override
    public E pop() {
    //如果栈空了,就抛出异常
    if (isEmpty()){
    throw new EmptyStackException();
    }
    E e = this.pollLast();
    return e;
    }
    ///////////////////////////////////collection//////////////////////////////////////
    /
    **

    • @functionName:remove
    • @description:删除集合元素
    • @param o 目标元素
    • @author yzh
    • @date 2019-04-20
    • @return boolean
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public boolean remove(Object o) {
      if(!isEmpty()){
      E e = null;
      for(int i = 0;i < size();i++){
      e = (E) headLastListDueue.get(i);
      if(o == null && e == null){
      headLastListDueue.delete(o);
      size–;
      return true;
      }else if(o != null && e != null && e.equals(o)){
      headLastListDueue.delete(o);
      size–;
      return true;
      }
      }
      }
      modCount++;
      return false;
      }

    /***

    • @functionName:contains
    • @description:判断元素是否在集合中
    • @param o 目标元素
    • @author yzh
    • @date 2019-04-20
    • @return boolean
      */
      @SuppressWarnings(“unchecked”)
      @Override
      public boolean contains(Object o) {
      if(!isEmpty()){
      E e = null;
      for(int i = 0;i < size();i++){
      e = (E) headLastListDueue.get(i);
      if(o == null && e == null){
      return true;
      }else if(o != null && e != null && e.equals(o)){
      return true;
      }
      }
      }
      return false;
      }

    /***

    • @functionName:iterator
    • @description:创建迭代器
    • @author yzh
    • @date 2019-04-13
      */
      @SuppressWarnings(“unchecked”)
      public MyIterator iterator() {
      return headLastListDueue.iterator();
      }

    /***

    • @functionName:toString
    • @description:重写toString方法
    • @author yzh
    • @date 2019-04-13
    • @return String
      @Override
      public String toString(){
      if(isEmpty()){
      return “[]”;
      }
      StringBuffer sbf = new StringBuffer();
      sbf.append("[");
      for(int i = 0;i sbf.append(headLastListDueue.get(i));
      if(i < size() - 1){
      sbf.append(",");
      }
      }
      sbf.append("]");
      return sbf.toString();
      }/
      /
      **
    • @functionName:toString
    • @description:重写toString方法
    • @author yzh
    • @date 2019-04-13
    • @return String
      */
      @Override
      public String toString(){
      MyIterator it = this.iterator();
      if(isEmpty()){
      return “[]”;
      }
      StringBuffer sbf = new StringBuffer();
      sbf.append("[");
      E e = null;
      for(;?{
      e = it.next();
      if(!it.hasNext()){
      return sbf.append(e).append("]").toString();
      }
      sbf.append(e).append(",");
      }
      }
      }
      说明:由于双端双向链表也是双端链表,因此也可以用于实现双端队列。关于具体实现留给读者作为练习。

你可能感兴趣的:(Java,数据结构与算法,Java底层原理)