基于数组的循环队列和基于链表的队列
来源:互联网 发布:mac发送pkg自动zip 编辑:程序博客网 时间:2024/05/16 07:03
数据的插入和取出涉及对当前数据量nItems属性的修改,大量的插入、移除操作时,对nItems属性的操作可能影响性能,可参考不包含数据项个数属性的队列实现。
基于数组的循环队列
包含数据项个数属性
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();}}
0 0
- 基于数组的循环队列和基于链表的队列
- 基于数组的循环队列
- 基于数组的循环队列
- 基于链表、数组实现队列、循环队列
- 基于数组和链表的队列实现
- 笔记七:基于数组的循环队列的实现
- 基于链表的栈和队列
- 基于数组的队列实现
- 基于数组的优先级队列
- 基于数组的队列Queue
- 基于数组的队列操作
- 基于数组的队列实现
- 常用数据结构之基于数组的循环队列
- 基于数组的循环队列(C++模板实现)
- 数据结构之——基于数组实现的循环队列
- C++基于模版的循环队列实现
- 基于数组和节点方式的队列的实现
- 队列基于链表和数组的实现方法(java)
- MacOS下配置go开发环境
- Java线程知识拾遗
- POJ-3071-dp,单调队列
- jQuery三种常见选择器
- MySql日期时间
- 基于数组的循环队列和基于链表的队列
- 开发flyray的初衷
- WIN10与Ubuntu16.04 双系统安装
- C直接插入排序
- CentOS6.5下修改mysql密码以及解决MySQL ERROR 1045 (28000):
- Python 算法
- leetcode第六周解题总结(98)
- opencv中的Mat
- Scikit-learn(python)学习笔记 (不定期更新)