队列(JAVA描述)

       队列是一种特殊的线性表,其特性体现在队列只允许在表尾插入数据元素,在表头删除元素,所以队列是一种操作受限的线性表,具有先进先出的特点。允许进行插入的一端称为队尾,允许进行删除的一端称为队首。队列也分为顺序和链式两种存储结构。如下为队列接口的代码:

public interface IQueue {

	public void clear();        //清空队列的操作
	
	public boolean isEmpty();   //判断是否为空
	
	public int length();        //求对列长度
	
	public Object peek();       //读取队首元素,并返回其值
	
	public void offer(Object x)throws Exception;   //将数据元素插入,并使其称为新的队尾元素
	
	public Object poll();       //删除队首元素并返回其值,若队列为空,则返回null
	
}

1、循环顺序队列类的描述:

public class CircleSqQueue implements IQueue{

	private Object[] queueElem;                //队列存储空间
	
	private int front;                         //队首的引用,若队列不空,指向队首元素。
	
	private int rear;                          //队尾的引用,若队列不空,指向队尾元素的下一个存储位置。
	
	public CircleSqQueue(int maxsize) {        //构造函数
		// TODO Auto-generated constructor stub
		front=rear=0;
		queueElem=new Object[maxsize];
	}
	
	@Override
	public void clear() {
		// TODO Auto-generated method stub
		front=rear=0;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return front==rear;
	}

	@Override
	public int length() {
		// TODO Auto-generated method stub
		return (rear-front+queueElem.length)%queueElem.length;
	}

	@Override
	public Object peek() {
		// TODO Auto-generated method stub
		if(front==rear){
			return null;
		}else
			return queueElem[front];
	}

	@Override
	public void offer(Object x) throws Exception {
		// TODO Auto-generated method stub
		if((rear+1)%queueElem.length==front){
			throw new Exception("队列已满!~");
		}else{
			queueElem[rear]=x;
			rear=(rear+1)%queueElem.length;            //修改队尾指针
		}
		
	}

	@Override
	public Object poll() {
		// TODO Auto-generated method stub
		if(front==rear){
			return null;
		}else{
			Object o=queueElem[front];
			front=(front+1)%queueElem.length;
			return o;                                  //返回队列的队首元素
		}
	}
	
	public void display(){
		if(!isEmpty()){
			for(int i=front;i!=rear;i=(i+1)%queueElem.length)
				System.out.println(queueElem[i].toString()+" ");
		}else
			System.out.println("此队列为空~!");
	}

}

2、链队列

        队列的链式存储结构也用不带头节点的单链表来实现。为了便于实现入队和出队的操作,需要引用两个指针front和rear来分别指向队首元素和队尾元素的结点。

       结点代码:

public class Node {
	
	public Object data;  //存放节点值
	
	public Node next;    //后继节点的引用
	
	public Node(){       //无参数的构造器
		this(null,null);
	}
	
	public Node(Object data){            //带一个参数时的构造函数
		this(data,null);
	}

	public Node(Object data,Node next){  //两个参数时的构造函数
		this.data=data;
		this.next=next;
	}
	
}

链式队列代码:

public class LinkQueue implements IQueue {

	private Node front; // 队首指针
	private Node rear; // 队尾指针

	public LinkQueue() {
		// TODO Auto-generated constructor stub
		front = rear = null;
	}

	@Override
	public void clear() { // 队列置空
		// TODO Auto-generated method stub
		front = rear = null;
	}

	@Override
	public boolean isEmpty() { // 判断队列是否为空
		// TODO Auto-generated method stub
		return front == null;
	}

	@Override
	public int length() {
		// TODO Auto-generated method stub
		Node p = front;
		int length = 0;
		while (p != null) {
			p = p.next;
			length++;
		}
		return length;
	}

	@Override
	public Object peek() {
		// TODO Auto-generated method stub
		if (front != null)
			return front.data;
		else
			return null;
	}

	@Override
	public void offer(Object x) throws Exception {
		// TODO Auto-generated method stub
		Node p = new Node(x); // 构造新节点
		if (front != null) {
			rear.next = p;
			rear = p;               //改变队尾的位置
		}else {
			front=rear=p;
		}
	}

	@Override
	public Object poll() {
		// TODO Auto-generated method stub
		if (front != null) {
			Node p = front;
			front = front.next;
			if (p == rear) // 被删除的结点是队尾结点时
				rear = null;
			return p.data;
		} else
			return null;
	}

}

3、优先级队列

      优先级队列是一种带有优先级的队列,它是一种比栈和队列更为专用的数据结构。与普通队列一样,优先级队列有一个队首和队尾,并且也是从队首删除元素,但不同的是优先级队列中数据元素案关键字的值有序排列。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值