Java实现队列

先写一个接口,确定要实现的功能
package myQueue;

public interface MyQueue<Object> {
	//删除队列
	void clear();
	//队尾插入元素
	boolean enqueue(Object data);
	//对首删除元素
	Object dequeue();
	//队列中元素的个数
	int length();
	//判断队列是否为空
	boolean isEmpty();
	//判断队里是否满了(用于顺序队列,在链式队列中可以空实现)
	boolean isFull();
}

顺序队列

package myQueue;

public class QueueArray implements MyQueue<Object>{
	private int size;
	private int MAX_SIZE;
	private int front;
	private int rear;
	private Object[] queueArray;
	
	public QueueArray(int MAX_SIZE)
	{
		size = front = rear = 0;
		this.MAX_SIZE = MAX_SIZE;
		queueArray = new Object[MAX_SIZE];
	}
	@Override
	public void clear() {
		front = rear;	
	}

	@Override
	public boolean enqueue(Object data) {
		if(size == MAX_SIZE)
			return false;
		rear = (rear + 1) % MAX_SIZE;
		queueArray[rear] = data;
		size++;
		return true;
	}

	@Override
	public Object dequeue() {
		if(size == 0)
			return null;
		Object obj = queueArray[front];
		front = (front + 1) % MAX_SIZE;
		size--;
		return obj;
	}

	@Override
	public int length() {
		return size;
	}

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public boolean isFull() {
		return size == MAX_SIZE;
	}
	
	public void print()
	{
		int pre = this.front;
		while(pre != rear)
		{
			System.out.print(queueArray[pre] + " ");
			pre = (pre + 1) % MAX_SIZE;
		}
		System.out.println();
	}
	public static void main(String[] args)
	{
		QueueArray qa = new QueueArray(20);
		for(int i = 0;i < 10;i++)
		{
			qa.enqueue(i);
		}
		qa.print();
		qa.dequeue();
		qa.print();
	}
}
链式队列

package myQueue;

public class QueueLL implements MyQueue{
	
	private class LinkNode
	{
		Object element;
		LinkNode next;
		
		LinkNode(Object element,LinkNode next)
		{
			this.element = element;
			this.next = next;
		}
		LinkNode(LinkNode next)
		{
			this.next = next;
		}
	}
	
	LinkNode front;
	LinkNode rear;
	int size;
	
	QueueLL()
	{
		front = rear = null;
		size = 0;
	}
	@Override
	public void clear() {
		while(front != null)
		{
			rear = front;
			front = front.next;
			rear = null;
		}
		rear = null;
		size = 0;	
	}

	@Override
	public boolean enqueue(Object data) {
		if(rear == null)
		{
			front = rear = new LinkNode(data,null);
		}
		else
		{
			rear.next = new LinkNode(data,null);
			rear = rear.next;
		}
		size++;
		return true;
	}

	@Override
	public Object dequeue() {
		if(size == 0)
			return null;
		LinkNode ltemp = front;
		front = front.next;
		Object obj = ltemp.element;
		if(front == null)
			rear = null;
		size--;
		return obj;
	}

	@Override
	public int length() {
		return size;
	}

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public boolean isFull() {
		return false;
	}
	
	public void print()
	{
		LinkNode ltemp = front;
		while(ltemp != null)
		{
			System.out.print(ltemp.element + " ");
			ltemp = ltemp.next;
		}
		System.out.println();
	}
	
	public static void main(String[] args)
	{
		QueueLL qll = new QueueLL();
		for(int i = 0;i < 10;i++)
		{
			qll.enqueue(i);
		}
		qll.print();
		qll.dequeue();
		qll.print();
		qll.enqueue(10);
		qll.print();
	}

}

有两个问题

1、再插入和删除的时候有些判断还不是太懂,要花点时间在上面

2、怎么消除头结点值为空,我想到了两种方法

a、在插入的时候判断

b、插入后删除头结点

第一种很定会怎加时间开销,而第二种有不符合面向对象的机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值