Java双向队列,用双向链表实现的
2017-08-15 12:06
190 查看
java双向队列,基于双向链表实现
同时实现正反向迭代package one; import java.util.Iterator; /* * * 双向队列,链表版 * * */ public class Dequeue<Item> implements Iterable<Item> { private Node first;//最左边的头节点 private Node last;//最右边的尾节点 private int N;//记录当前有多少的节点被存贮 private class Node{ private Node pre; private Node next; private Item item; } //返回存贮节点个数 public int size(){ return N; } //是否为空 private boolean isEmpty(){ return N==0; } //左进 public void pushLeft(Item item){ if(isEmpty()){ first=new Node(); first.item=item; last=first; } else{ Node oldFirst=first; first=new Node(); first.item=item; first.next=oldFirst; oldFirst.pre=first; } N++; } //右进 public void pushRight(Item item){ if(isEmpty()){ last=new Node(); last.item=item; first=last; }else{ Node oldLast=last; last=new Node(); last.item=item; last.pre=oldLast; oldLast.next=last; } N++; } //左出 public Item popLeft() throws Exception{ //当为空时报错 if(isEmpty()){ throw new Exception("没有了"); } Item item=first.item; first=first.next; if(N==1){ first=last=null;//当只有一个节点时也准备出的时候,last和first同时置null } else{ first.pre=null;//丢弃前一个节点 } N--; return item; } //右出,同理 public Item popRight() throws Exception{ if(isEmpty()){ throw new Exception("没有啦"); } Item item=last.item; last=last.pre; if(N==1){ first=last=null; } else{ last.next=null; } N--; return item; } //打印 public void print(){ Node current=first; while(current!=null){ System.out.print(current.item+" "); current=current.next; } System.out.println(); } //正向迭代 @Override public Iterator<Item> iterator() { return new Iterator<Item>(){ Node current=first; @Override public boolean hasNext() { return current!=null; } @Override public Item next() { Item item=current.item; current=current.next; return item; } }; } //反向迭代 public Iterable<Item> reverseIterator(){ return new Iterable<Item>(){ @Override public Iterator<Item> iterator() { return new Iterator<Item>(){ Node current=last; @Override public boolean hasNext() { return current!=null; } @Override public Item next() { Item item=current.item; current=current.pre; return item; } }; } }; } //测试 public static void main(String[] args) throws Exception{ Dequeue<String> q=new Dequeue<String>(); q.pushLeft("a"); q.pushLeft("b"); q.pushLeft("c"); q.pushRight("c"); q.pushRight("b"); q.pushRight("a"); System.out.println("左出"); q.print();//c b a c b a q.popLeft(); q.print();//b a c b a q.popLeft(); q.print();//a c b a q.popLeft(); q.print();//c b a q.popLeft(); q.print();//b a q.popLeft(); q.print();//a q.popLeft(); q.print();//空 //在来一遍 q.pushLeft("a"); q.pushLeft("b"); q.pushLeft("c"); q.pushRight("c"); q.pushRight("b"); q.pushRight("a"); System.out.println("右出"); q.print();//c b a c b a q.popRight(); q.print();//c b a c b q.popRight(); q.print();//c b a c q.popRight(); q.print();//c b a q.popRight(); q.print();//c b q.popRight(); q.print();//c q.popRight(); q.print(); System.out.println("---------------"); q.pushLeft("a"); q.pushLeft("b"); q.pushLeft("c"); q.pushLeft("d"); q.pushLeft("e"); q.pushLeft("f"); System.out.println("正向排序"); for(String a:q){ System.out.print(a+" "); } System.out.println(); System.out.println("反向排序"); for(String a:q.reverseIterator()){ System.out.print(a+" "); } } }
相关文章推荐
- Java 实现双向链表,基于双向链表实现双端队列
- java数据结构与算法之双向循环队列的数组实现方法
- 一个用Java实现的双向队列,可以分别在头尾插入和删除节点
- JAVA实现最简单的双向链表、队列与栈(内部使用链表形式存储)
- java 双向链表实现双端队列
- 队列的C++类,用双向链表实现,可实现双向弹出元素。(绝对高科技)
- 用Java实现HTTP文件队列下载
- 如何实现java文件队列下载
- 使用java.util.concurrent实现的线程池、消息队列功能
- 使用Java程序来实现HTTP文件的队列下载
- JAVA基础:用Java实现HTTP文件队列下载
- Java:基于LinkedList实现栈和队列
- SSL双向认证java实现
- 用类实现队列(JAVA)
- 用Java实现HTTP文件队列下载-Java基础-Java-编程开发
- java 实现的队列
- pthread&双向链表实现队列
- 用Java实现HTTP文件队列下载
- Java语言中链表和双向链表的实现-Java基础-Java-编程开发
- Java语言中链表和双向链表的实现