数据结构之Deque

Deque的ADT定义如下:

package com.dzlijian.utils.comments;

/**
 * 
 * @ClassName:  Deque   
 * @Description:双端队列ADT 
 * @author: 长子科技 
 * @date:   2021年7月7日 下午11:03:32   
 *   
 * @param <E>  
 * @Copyright: 2021 www.tydic.com Inc. All rights reserved. 
 */
public interface Deque<E> {
	public int size();
	public boolean  empty();
	public void  addFirst(E e);
	public void  addLast(E e);
	
	public E  removeFirst();
	public E  removeLast();
	
	public E  peekFirst();
	public E  peekLast();

}

1,数组方式实现:

package com.dzlijian.utils.comments;

import java.util.Arrays;

import org.apache.commons.collections.list.GrowthList;
/**
 * 
 * @ClassName:  Deque   
 * @Description:双端队列数组实现
 * @author: 长子科技 
 * @date:   2021年7月7日 下午11:03:32   
 *   
 * @param <E>  
 * @Copyright: 2021 www.tydic.com Inc. All rights reserved. 
 */
public class ArrayDeque<E> implements Deque<E> {
	private static final int DEFAULT_CAPACITY=10;
	private int size;
	private E[] data;
	private int head=-1;
	private int tail=-1;
	
	public ArrayDeque(int capacity){
		data=(E[])new Object[capacity];
		size=0;
	}
	public ArrayDeque(){
		this(DEFAULT_CAPACITY);
	}

	
	@Override
	public int size() {
		return size;
	}

	@Override
	public boolean empty() {
		return size==0;
	}
	
	private void grow(int capacity){
		if(capacity<=0){
			throw new IllegalArgumentException("新建数组长度非法");
		}
		if(capacity<DEFAULT_CAPACITY){
			return;
		}
		if(capacity>data.length){
			data=Arrays.copyOf(data, capacity);
		}else{
			E[] newdata=(E[])new Object[capacity];
			head=0;
			tail=0;
			for(int i=0;i<data.length;i++){
				if(data[i]!=null){
					newdata[tail++]=data[i];
				}
			}
			tail--;
			data=newdata;
		}
		
		
	}

	@Override
	public void addFirst(E e) {
		if(e==null){
			throw new IllegalArgumentException("插入参数为空!!");
		}
		if(size==0){
			data[0]=e;
			head=0;
			tail=0;
			size++;
			return;
		}
		if(size==data.length){
			grow(size*2);
		};
		if(head==0){
			E[] newdata=(E[])new Object[data.length];
			newdata[0]=e;
			for(int i=1;i<data.length;i++){
				newdata[i]=data[i-1];
			}
			data=newdata;
			tail++;
		}else{
			data[--head]=e;
		}
		size++;
	}

	@Override
	public void addLast(E e) {
		if(e==null){
			throw new IllegalArgumentException("插入参数为空!!");
		}
		if(size==0){
			data[0]=e;
			head=0;
			tail=0;
			size++;
			return;
		}
		if(size==data.length){
			grow(size*2);
		};
		if(tail<data.length-1){
			data[++tail]=e;
		}else{
			E[] newdata=(E[])new Object[data.length];
			newdata[tail]=e;
			for(int i=data.length-1;i>0;i--){
				newdata[i-1]=data[i];
			}
			data=newdata;
			head--;
		}
		size++;
	}

	@Override
	public E removeFirst() {
		if(size==0){
			throw new RuntimeException("空队列!");
		}
		E result=data[head];
		data[head]=null;
		head++;
		size--;
		if(size<data.length/2){
			grow(data.length/2);
		}
		
		return result;
	}

	@Override
	public E removeLast() {
		if(size==0){
			throw new RuntimeException("空队列!");
		}
		E result=data[tail];
		data[tail]=null;
		tail--;
		size--;
		if(size<data.length/2){
			grow(data.length/2);
		}
		
		return result;
	}

	@Override
	public E peekFirst() {
		if(size==0){
			throw new RuntimeException("空队列!");
		}
		return data[head];
	}

	@Override
	public E peekLast() {
		if(size==0){
			throw new RuntimeException("空队列!");
		}
		return data[tail];
	}

	public static void main(String[] args) {
		Deque<Integer> test=new ArrayDeque<Integer>();
		for(int i=1;i<6;i++){
			test.addFirst(i);
		}
		System.out.println(test.size());
		for(int i=1;i<6;i++){
			test.addLast(i);
		}
		System.out.println(test.size());
		for(int i=1;i<6;i++){
			test.addFirst(i);
		}
		System.out.println(test.size());
		for(int i=1;i<6;i++){
			test.addLast(i);
		}
		System.out.println(test.size());
		for(int i=1;i<6;i++){
			test.removeFirst();
		}
		System.out.println(test.size());
		for(int i=1;i<6;i++){
			test.removeLast();
		}
		System.out.println(test.size());
		for(int i=1;i<6;i++){
			test.removeFirst();
		}
		System.out.println(test.size());
		for(int i=1;i<6;i++){
			test.removeLast();
		}
		System.out.println(test.size());
	}
}

2,链表实现方式1:

package com.dzlijian.utils.comments;
/**
 * 
 * @ClassName:  Deque   
 * @Description:双端队列链表实现1
 * @author: 长子科技 
 * @date:   2021年7月7日 下午11:03:32   
 *   
 * @param <E>  
 * @Copyright: 2021 www.tydic.com Inc. All rights reserved. 
 */
public class LinkedDeque<E> implements Deque<E> {
	private int size;
	private Node<E> head;
	private Node<E> tail;
	
	private static class Node<E>{
		private Node<E> front;
		private E data;
		private Node<E> next;
		
		public Node(Node<E> front,E e,Node<E> next){
			this.front=front;
			this.data=e;
			this.next=next;
		}
	}
	
	public LinkedDeque(){
		size=0;
		head=null;
		tail=null;
	}

	@Override
	public int size() {
		return size;
	}

	@Override
	public boolean empty() {
		return size==0;
	}

	@Override
	public void addFirst(E e) {
		if(e==null){
			throw new IllegalArgumentException("插入参数为空!!");
		}
		if(size==0){
			head=new Node<E>(null,e,null);
			tail=head;
			size++;
			return;
		}
		Node<E> pre=head;
		head=new Node<E>(null,e,head);
		pre.front=head;
		size++;
	}

	@Override
	public void addLast(E e) {
		if(e==null){
			throw new IllegalArgumentException("插入参数为空!!");
		}
		if(size==0){
			head=new Node<E>(null,e,null);
			tail=head;
			size++;
			return;
		}
		Node<E> pre=tail;
		tail=new Node<E>(tail,e,null);
		pre.next=tail;
		size++;
	}

	@Override
	public E removeFirst() {
		if(size==0){
			throw new RuntimeException("空队列!");
		}
		Node<E> result=head;
		head=result.next;
		if(head!=null){
			head.front=null;
		}
		
		size--;
		if(size==0){
			head=null;
			tail=null;
		}
		return result.data;
	}

	@Override
	public E removeLast() {
		if(size==0){
			throw new RuntimeException("空队列!");
		}
		Node<E> result=tail;
		tail=result.front;
		if(tail!=null){
			tail.next=null;
		}
		size--;
		if(size==0){
			head=null;
			tail=null;
		}
		return result.data;
	}

	@Override
	public E peekFirst() {
		if(size==0){
			throw new RuntimeException("空队列!");
		}
		return head.data;
	}

	@Override
	public E peekLast() {
		if(size==0){
			throw new RuntimeException("空队列!");
		}
		return tail.data;
	}
	
	public static void main(String[] args) {
		Deque<Integer> test=new LinkedDeque<Integer>();
		
		for(int i=1;i<6;i++){
			test.addLast(i);
		}
		
		System.out.println(test.size());
		
		for(int i=1;i<6;i++){
			test.addFirst(i);
		}
		System.out.println(test.size());
		
		for(int i=1;i<6;i++){
			test.removeLast();
		}
		System.out.println(test.size());
		
		for(int i=1;i<6;i++){

			test.removeFirst();
		}
		System.out.println(test.size());
		
		
	}

}

3,链表实现Deque2:
package com.dzlijian.utils.comments;
/**
*

  • @ClassName: Deque

  • @Description:双端队列链表实现2

  • @author: 长子科技

  • @date: 2021年7月7日 下午11:03:32

  • @param

  • @Copyright: 2021 www.tydic.com Inc. All rights reserved.
    */
    public class LinkedDeque2 implements Deque {
    private int size;
    private Node head;
    private Node tail;

    private static class Node{
    private E data;
    private Node next;

     public Node(E e,Node<E> next){
     	this.data=e;
     	this.next=next;
     }
    

    }

    public LinkedDeque2(){
    size=0;
    head=null;
    tail=null;
    }

    @Override
    public int size() {
    return size;
    }

    @Override
    public boolean empty() {
    return size==0;
    }

    @Override
    public void addFirst(E e) {
    if(enull){
    throw new IllegalArgumentException(“插入参数为空!!”);
    }
    if(size
    0){
    head=new Node(e,null);
    tail=head;
    size++;
    return;
    }
    head=new Node(e,head);
    size++;
    }

    @Override
    public void addLast(E e) {
    if(enull){
    throw new IllegalArgumentException(“插入参数为空!!”);
    }
    if(size
    0){
    head=new Node(e,null);
    tail=head;
    size++;
    return;
    }

     Node<E> pre=tail;
     tail=new Node<E>(e,null);
     pre.next=tail;
     size++;
    

    }

    @Override
    public E removeFirst() {
    if(size0){
    throw new RuntimeException(“空队列!”);
    }
    Node result=head;
    head=head.next;
    size–;
    if(size
    0){
    head=null;
    tail=null;
    }
    return result.data;
    }

    @Override
    public E removeLast() {
    if(size==0){
    throw new RuntimeException(“空队列!”);
    }
    Node result=tail;
    //使用单向节点,此时需要循环查找,非常耗时。
    Node i=head;
    while(i.next!=tail&&i.next!=null){
    i=i.next;

     }
     tail=i;
     i.next=null;
     size--;
     if(size==0){
     	head=null;
     	tail=null;
     }
     return result.data;
    

    }

    @Override
    public E peekFirst() {
    if(size==0){
    throw new RuntimeException(“空队列!”);
    }
    return head.data;
    }

    @Override
    public E peekLast() {
    if(size==0){
    throw new RuntimeException(“空队列!”);
    }
    return tail.data;
    }

    public static void main(String[] args) {
    Deque test=new LinkedDeque2();
    for(int i=1;i<6;i++){
    test.addFirst(i);
    }
    System.out.println(test.size());
    for(int i=1;i<6;i++){
    test.addLast(i);
    }

     System.out.println(test.size());
     
     for(int i=1;i<6;i++){
     	test.removeFirst();
     }
     System.out.println(test.size());
     
     for(int i=1;i<6;i++){
     	test.removeLast();
     }
     System.out.println(test.size());
    

    }

}
,
链表实现的2中方式,区别在于,节点是否有前一个和后一个的节点的地址指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一截木化石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值