Queue-java

来源:互联网 发布:php手册下载 编辑:程序博客网 时间:2024/06/05 05:55

 

队列的链式与数组仿真JAVA实现
文件清单如下:
Node.java  //链结点接口
SLNode.java  //链结点实现
QueueEmptyException.java//队列异常处理类
Queue.java  //队列接口定义类
QueueSLinked.java //链式结构实现队列
QueueArray.java  //循环数组实现队列
queueDemo.java  //测试队列功能
*******************************************************
//complied OK with Eclipse
//Node.java
//链结点接口
package dsa.datastruct;
public interface Node{
 //获取结点数据域
 public Object getData();
 //设置结点数据域
 public void setData(Object obj);
 
}
*******************************************************
//complied OK with Eclipse
//SLNode.java
//链结点实现
package dsa.datastruct;

public class SLNode implements Node{
 private Object element; //数据成员
 private SLNode next; //指向下一个成员结点
 //两个构造器
 public SLNode(){this(null,null);}
 public SLNode(Object obj, SLNode nextnode){
  this.element=obj;
  this.next =nextnode;
 }
 //2对属性读取器
 public void  setNext(SLNode nextnode){this.next=nextnode;}
 public SLNode  getNext(){return next;}
 public void  setData(Object obj){element=obj;}
 public Object getData(){return element;}
 
}
*******************************************************
//file name: QueueEmptyException.java
//队列异常处理类
package dsa.datastruct;
public class QueueEmptyException extends RuntimeException{
 public QueueEmptyException(String err) {
  super(err);
 } 
}
*******************************************************
//file name Queue.java
//队列接口定义类
package dsa.datastruct;
import dsa.datastruct.QueueEmptyException;
public interface Queue {
 //返回队列的大小
 public int getSize(); 
 //判断队列是否为空
 public boolean isEmpty();
 //数据元素e入队
 public void enqueue(Object e);
 //队首元素出队
 public Object dequeue() throws QueueEmptyException;
 //取队首元素
 public Object peek() throws QueueEmptyException;
}
*******************************************************
//file name: QueueSLinked.java
//complied ok with eclipse
//队列的链式实现类
package dsa.datastruct;
import dsa.datastruct.QueueEmptyException;//导入队列异常处理类
public class QueueSLinked implements Queue {
 private SLNode front; //头结点
 private SLNode rear; //尾结点
 private int size;    //队列结点数
 //0.构造器
 public QueueSLinked(){
  front =new SLNode();
  rear =front;
  size =0;
 }
 //1.返回队列大小
 public int getSize() { return size;} 

 //2.判断队列是否为空
 public boolean isEmpty() {return size==0;}
 
 //3.数据元素e入队
 public void enqueue(Object e) {
  SLNode p=new SLNode(e,null);
  rear.setNext(p);
  rear =p;
  size++;
 }
 //4.队首元素出队
 public Object dequeue() throws QueueEmptyException {
  if (size<1) throw new QueueEmptyException("错误:队列为空");
  SLNode p =front.getNext();//取得结点
  front.setNext(p.getNext()); //头结点指向下一个结点
  size--;    //结点个数减1
  if (size<1) rear=front;  //如果结点个数<1,则尾结点指向头结点  
  return p.getData();  //返回结点p的数据
 }
 //5.取队首元素
 public Object peek() throws QueueEmptyException {
  if (size<1) throw new QueueEmptyException("错误:队列为空");  
  return front.getNext().getData();//返回头结点的数据
 }
}

*******************************************************
//file name:  QueueArray.java
//complied ok with eclipse
//循环数组实现队列
package dsa.datastruct;
import dsa.datastruct.QueueEmptyException;
public class QueueArray implements Queue {
 private static final int CAP=8;//队列默认大小
 private Object[] elements;  //数组elements
 private int capacity;   //数组大小
 private int front;    //队首指针
 private int rear;    //队尾指针
 //0.构造器
 public QueueArray(){this(CAP);}
 public QueueArray(int size){
  capacity =size + 1;
  elements =new Object[capacity];
  front  =0;
  rear  =0;
 }
 //1.返回队列的大小
 public int getSize() { return (capacity - front +rear)%capacity; }
 //2.判断队列是否为空
 public boolean isEmpty() { return front==rear;} 
 //3.数据元素e入队
 public void enqueue(Object e) {
  if(getSize()==(capacity-1))
   expandSpace(); //修正数组
  elements[rear]=e; //插入数据
  rear=(rear+1)%capacity;//修正尾指针
 }
 //4.队首元素出队
 public Object dequeue() throws QueueEmptyException {
  if(isEmpty()) throw new QueueEmptyException("错误:队列为空");
  Object obj=elements[front];//取得队首数据
  elements[front]=null; //置队首为空
  front=(front+1)%capacity;//修正队首指针
  return obj;
 }
 //5.取队首元素
 public Object peek() throws QueueEmptyException {
  if(isEmpty()) throw new QueueEmptyException("错误:队列为空");  
  return elements[front];//直接返回数组的队首元素
 }
 //修正循环数组私有函数
 private void expandSpace(){
  Object[] a = new Object[elements.length*2];
  int i=front;
  int j=0;
  while(i!=rear){a[j++]=elements[i]; i=(i+1)%capacity;}
  elements=a;
  capacity=elements.length;
  front=0;
  rear=j;
 } 
}
*******************************************************
//file name: queueDemo.java
//complied ok with Eclipse 3.40
//测试队列功能
package dsa.test;
import dsa.datastruct.*;

public class queueDemo {
 public static void main(String[] args) {
  QueueArray q1 = new QueueArray(10);//循环数组仿真队列
  q1.enqueue(15);
  q1.enqueue(22);  
  q1.enqueue(38); 
  q1.dequeue();
  System.out.println("q1.isEmpty()="+q1.isEmpty());
  System.out.println("q1.peek()="+q1.peek()); 
  System.out.println("q1.getSize()="+q1.getSize()); 
  
  QueueSLinked q2 = new QueueSLinked();//链点仿真队列 
  q2.enqueue(100);
  q2.enqueue(200); 
  q2.enqueue(300);  
  q2.dequeue();
  System.out.println("q2.isEmpty()="+q2.isEmpty());
  System.out.println("q2.peek()="+q2.peek()); 
  System.out.println("q2.getSize()="+q2.getSize()); 
  
 }
}

运行结果:
q1.isEmpty()=false
q1.peek()=22
q1.getSize()=2
q2.isEmpty()=false
q2.peek()=200
q2.getSize()=2

原创粉丝点击