基于数组的循环队列和基于链表的队列
2017-04-08 00:20
483 查看
数据的插入和取出涉及对当前数据量nItems属性的修改,大量的插入、移除操作时,对nItems属性的操作可能影响性能,可参考不包含数据项个数属性的队列实现。
public class Link {
public long dData;
public Link next;
public Link(long d){
dData=d;
}
public void displayLink(){
System.out.print(dData+" ");
}
}
基于数组的循环队列
包含数据项个数属性
package datastructure.c4.queue.queuedef; public class Queue { private int maxSize; private long[] queArray; private int front; private int rear; private int nItems; public Queue(int s){ maxSize=s; queArray=new long[maxSize]; front=0; rear=-1; nItems=0; } public void insert(long j){ if(rear==maxSize-1){ rear=-1; } queArray[++rear]=j; nItems++; } public long remove(){ long temp=queArray[front++]; if(front==maxSize){ front=0; } nItems--; return temp; } public long peekFront(){ return queArray[front]; } public boolean isEmpty(){ return (nItems==0); } public boolean isFull(){ return (nItems==maxSize); } public int size(){ return nItems; } }
package datastructure.c4.queue.queuedef; public class QueueApp { public static void main(String[] args) { Queue theQueue=new Queue(5); theQueue.insert(10); theQueue.insert(20); theQueue.insert(30); theQueue.insert(40); theQueue.remove(); theQueue.remove(); theQueue.remove(); theQueue.insert(50); theQueue.insert(60); theQueue.insert(70); theQueue.insert(80); while(!theQueue.isEmpty()){ long n = theQueue.remove(); System.out.print(n); System.out.print(" "); } System.out.println(""); } }
不包含数据项个数属性
package datastructure.c4.queue.nonitems; public class QueueWithoutN { private int maxSize; private long[] queArray; private int front; /** * rear作为写值的标志,插入时会在rear的下一个位置写入新值, * 当rear=maxSize-1,也就是rear指向的数组的最后一个值, * 要将rear设为-1,形成循环队列 */ private int rear; public QueueWithoutN(int s){ maxSize=s+1; queArray=new long[maxSize]; front=0; rear=-1; } /** * 新值位于rear的后一个位置 * @param j */ public void insert(long j){ if(rear==maxSize-1){ rear=-1; } queArray[++rear]=j; } /** * 取值时取front位置当前值,front后移一位 * 当front是数组最后一个元素时,后移一位后front=maxSize, * 令front=0 * @return */ public long remove(){ long temp=queArray[front++]; if(front==maxSize){ front=0; } return temp; } public long peek(){ return queArray[front]; } /** * 1、rear+1==front说明下次写入值会覆盖front当前值,说明队列为空 * 2、front+maxSize-1==rear --> rear-front=maxSize-1(数组下标最大值), * 只能rear=maxSize-1,front=0(front是数组第一个元素,rear是数组最后一个元素), * 下次写入也会覆盖front当前值 * @return front与rear位置差1的所有情况返回true */ public boolean isEmpty(){ return (rear+1==front || front+maxSize-1==rear); } /** * 队列为空时rear位于front前一个位置, * 写满时,rear位于front前两个位置 * @return front与rear位置差2的所有情况返回true */ public boolean isFull(){ return (rear+2==front || front+maxSize-2==rear); } /** * 1、rear>=front,说明未循环,元素数量为rear与front之间的元素数 * 2、rear<front,说明已循环插入,(maxSize-front)为front到数组最后的元素数, * (rear+1)为数组开始(下标为0)到rear间的元素数 * @return */ public int size(){ if(rear>=front){ return rear-front+1; }else{ return (maxSize-front)+(rear+1); } } }
基于双端链表的队列
package datastructure.c5.linklist.linkqueue;public class Link {
public long dData;
public Link next;
public Link(long d){
dData=d;
}
public void displayLink(){
System.out.print(dData+" ");
}
}
package datastructure.c5.linklist.linkqueue; public class FirstLastList { private Link first; private Link last; public FirstLastList(){ first=null; last=null; } public boolean isEmpty(){ return first==null; } public void insertLast(long dd){ Link newLink =new Link(dd); if(isEmpty()){ first=newLink; }else{ last.next=newLink; } last=newLink; } public long deleteFirst(){ long temp=first.dData; if(first.next==null){ last=null; } first=first.next; return temp; } public void displayList(){ Link current=first; while(current!=null){ current.displayLink(); current=current.next; } System.out.println(""); } }
package datastructure.c5.linklist.linkqueue; public class LinkQueue { private FirstLastList theList; public LinkQueue(){ theList=new FirstLastList(); } public boolean isEmpty(){ return theList.isEmpty(); } public void insert(long j){ theList.insertLast(j); } public long remove(){ return theList.deleteFirst(); } public void displayQueue(){ System.out.print("Queue (front-->rear):"); theList.displayList(); } }
package datastructure.c5.linklist.linkqueue; public class LinkQueueApp { public static void main(String[] args) { LinkQueue theQueue=new LinkQueue(); theQueue.insert(20); theQueue.insert(40); theQueue.displayQueue(); theQueue.insert(60); theQueue.insert(80); theQueue.displayQueue(); theQueue.remove(); theQueue.remove(); theQueue.displayQueue(); } }
相关文章推荐
- 基于链表、数组实现队列、循环队列
- 基于数组的循环队列
- 基于循环数组的无锁队列
- 队列基于链表和数组的实现方法(java)
- 基于数组和链表的队列实现
- 数据结构之——基于数组实现的循环队列
- 20162314 王译潇 课上用链表和数组实现循环队列
- 队列—链表与循环数组实现
- Python 使用由单链表构建的数组实现有边际优先队列 (基于class, 包含迭代器)
- 队列--基于动态循环数组实现(Java)
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- 基于数组的循环队列(C++模板实现)
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- 笔记七:基于数组的循环队列的实现
- 队列--基于简单循环数组实现(Java)
- 基于Java数组实现循环队列的两种方法小结
- 基于数组的循环队列(C++模板实现)
- Python 使用循环数组实现队列 (基于class, 包含迭代器)
- 这里实现一个基于数组的线程安全的循环队列
- 基于数组的循环队列