用单链表与数组实现队列先进先出的数据结构
2018-01-07 13:21
661 查看
1.自定义Node.java实体类:
package data_table.syn.com.common.util;
/**
* 简单封装Node节点
* @author Administrator
*
*/
public class Node {
private Object value;// 值
private Node next; // 下一个对象的地址值
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node() {
super();
// TODO Auto-generated constructor stub
}
public Node(Object value) {
super();
this.value = value;
}
}
2.数组实现队列先进先出的数据结构:
package data_table.syn.com.common.util;
/**
* 数组实现队列结构,先进先出
* @author Administrator
*
*/
public class QueueByArray {
private int size=0;
private Object[] que=new Object[8];
public int size() {
return size;
}
/**
* 进队列
* @param object
*/
public void enQue(Object value) {
if (size>=que.length) {
Object[] stemp=new Object[que.length*2];
for(int i=0;i<que.length;i++) {
stemp[i]=que[i];
}
que=stemp;
}else {
que[size]=value;
}
size++;
}
/**
* 出队列
* @return
*/
public Object deQue() {
if(size<=0) {
throw new ArrayIndexOutOfBoundsException();
}
Object value=que[0]; // 取出第一个存储的值
que[0]=null;
if (size>1) {
for(int i=1;i<size;i++) {
que[i-1]=que[i];
}
}
size--;
return value;
}
}
3.单链表实现队列的先进先出的数据结构:
package data_table.syn.com.common.util;
/**
* 但链条实现队列结构,先进先出
* @author Administrator
*
*/
public class QueueByLink {
private int size=0;
private Node head=null;
//private Node behind=null;
public int size() {
return this.size;
}
/**
* 进队列
* @param object
*/
public void enQue(Object value) {
Node newNode=new Node(value);
if (head==null) {
head=newNode;
}else {
/*if (behind==null) { //第二节点
Node temp=head;
while (temp.getNext()!=null) {
temp=temp.getNext();
}
temp.setNext(newNode);
behind=temp;
}else { // 多个节点
behind.setNext(newNode);
behind=behind.getNext();
}*/
Node temp=head;
while (temp.getNext()!=null) {
temp=temp.getNext();
}
temp.setNext(newNode);
}
size++;
}
/**
* 出队列
* @return
*/
public Object deQue() {
if (size<=0) {
throw new ArrayIndexOutOfBoundsException();
}
Object value=head.getValue();
if (size==1) {
head=null;
return value;
}
head=head.getNext(); // 将头付给它的下一个节点
return value;
}
}
4.比较性能:
a1)数组进队列:当存储在数组的长度内,数组直接拿到数组的size,可以直接存值,当存值超出数组的长度,数组需要扩容,性能消耗较大。
a2)链条进队列:遍历整个链条,取到最后的node节点,存值。
比较:当存值一定,数组进队列要比链条性能好的多。当存值不定时,性能数组稍差,综合考虑,数组进队列稍胜一筹。
b1)数组出队列:拿到数组的第一个值出队列,然后将数组其他的元素向前移动,性能较差。数据越大,性能越差。
b2)链条出队列:拿到head节点出队列,将他的下一个节点赋值为head节点,效率非常高。
比较:链条远胜于数组
综合比较:数组与但链条实现队列不分胜负。
注意:单针对我自己实现的基础上。可以优化。
package data_table.syn.com.common.util;
/**
* 简单封装Node节点
* @author Administrator
*
*/
public class Node {
private Object value;// 值
private Node next; // 下一个对象的地址值
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node() {
super();
// TODO Auto-generated constructor stub
}
public Node(Object value) {
super();
this.value = value;
}
}
2.数组实现队列先进先出的数据结构:
package data_table.syn.com.common.util;
/**
* 数组实现队列结构,先进先出
* @author Administrator
*
*/
public class QueueByArray {
private int size=0;
private Object[] que=new Object[8];
public int size() {
return size;
}
/**
* 进队列
* @param object
*/
public void enQue(Object value) {
if (size>=que.length) {
Object[] stemp=new Object[que.length*2];
for(int i=0;i<que.length;i++) {
stemp[i]=que[i];
}
que=stemp;
}else {
que[size]=value;
}
size++;
}
/**
* 出队列
* @return
*/
public Object deQue() {
if(size<=0) {
throw new ArrayIndexOutOfBoundsException();
}
Object value=que[0]; // 取出第一个存储的值
que[0]=null;
if (size>1) {
for(int i=1;i<size;i++) {
que[i-1]=que[i];
}
}
size--;
return value;
}
}
3.单链表实现队列的先进先出的数据结构:
package data_table.syn.com.common.util;
/**
* 但链条实现队列结构,先进先出
* @author Administrator
*
*/
public class QueueByLink {
private int size=0;
private Node head=null;
//private Node behind=null;
public int size() {
return this.size;
}
/**
* 进队列
* @param object
*/
public void enQue(Object value) {
Node newNode=new Node(value);
if (head==null) {
head=newNode;
}else {
/*if (behind==null) { //第二节点
Node temp=head;
while (temp.getNext()!=null) {
temp=temp.getNext();
}
temp.setNext(newNode);
behind=temp;
}else { // 多个节点
behind.setNext(newNode);
behind=behind.getNext();
}*/
Node temp=head;
while (temp.getNext()!=null) {
temp=temp.getNext();
}
temp.setNext(newNode);
}
size++;
}
/**
* 出队列
* @return
*/
public Object deQue() {
if (size<=0) {
throw new ArrayIndexOutOfBoundsException();
}
Object value=head.getValue();
if (size==1) {
head=null;
return value;
}
head=head.getNext(); // 将头付给它的下一个节点
return value;
}
}
4.比较性能:
a1)数组进队列:当存储在数组的长度内,数组直接拿到数组的size,可以直接存值,当存值超出数组的长度,数组需要扩容,性能消耗较大。
a2)链条进队列:遍历整个链条,取到最后的node节点,存值。
比较:当存值一定,数组进队列要比链条性能好的多。当存值不定时,性能数组稍差,综合考虑,数组进队列稍胜一筹。
b1)数组出队列:拿到数组的第一个值出队列,然后将数组其他的元素向前移动,性能较差。数据越大,性能越差。
b2)链条出队列:拿到head节点出队列,将他的下一个节点赋值为head节点,效率非常高。
比较:链条远胜于数组
综合比较:数组与但链条实现队列不分胜负。
注意:单针对我自己实现的基础上。可以优化。
相关文章推荐
- Lua中使用table实现的其它5种数据结构(数组、链表、队列、集合和包、StringBuild)
- 数据结构之循环数组实现队列
- 几种简单的数据结构的C++实现,树,图,链表,环形队列,栈等---栈篇
- 数据结构与实现——数组、矩阵、链表、队列、栈、对象、二叉树和红黑树
- 数据结构:用单链表实现的队列
- 数据结构之——基于数组实现的循环队列
- 使用JavaScript的数组实现数据结构中的队列与堆栈
- 数据结构(三)队列(一)链表实现
- 【郝斌数据结构自学笔记】57-59_递归8 _ 汉诺塔_1线性结构总复习 2线性结构和非线性结构关系 3栈队列链表数组之间的关系【重点】
- 分别用数组和链表实现栈和队列
- 【数据结构】队列-数组的实现
- 队列的数组和链表实现
- 队列的数组和链表实现
- 用数组和链表实现队列操作
- 几种简单的数据结构的C++实现,树,图,链表,环形队列,栈等---环形队列篇
- java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表
- 队列—链表与循环数组实现
- 使用JavaScript的数组实现数据结构中的队列与堆栈
- 数据结构和算法--队列的数组实现
- 数据结构:双向链表实现队列与循环链表