线性表——队列(java实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YIXIANG0234/article/details/79952572

一,队列

队列也是一种线性表——受限的线性表,队列的数据操作是:插入数据在表的一端进行,称为队尾,删除数据在表的另一端进行,称为队首。队列是一种先进先出的数据结构。队列也可以采用两种方式来实现,即顺序表(顺序队列)和链表(链队列),这里我采用链表来实现,另外我还采用了数组实现的方式。


二,链表实现

public class MyQueue<T> {
	private MyLinkedList<T> queue;	//使用聚合方式实现队列,用链表存储数据
	public MyQueue()	//初始化链表
	{
		queue = new MyLinkedList<T>();
	}
	public boolean addFront(T data)//调用链表的add方法在队尾添加元素
	{
		return queue.add(data);
	}
	public T remove()	//调用链表的remove方法,删除队首元素
	{
		return queue.remove(0);
	}
	public T peek()//调用链表的get方法,获取队首元素
	{
		return queue.get(0);
	}
	public boolean isEmpty()//调用链表的isEmpty判断队列是否为空
	{
		return queue.isEmpty();
	}
}

MyLinkedList类详情可以参考文章:
https://blog.csdn.net/YIXIANG0234/article/details/79949967

三,测试

import static java.lang.System.*;
public class TestMyQueue {
	public static void main(String[] args) {
		MyQueue<String> queue = new MyQueue<String>();
		queue.addFront("李白");
		queue.addFront("杜甫");
		queue.addFront("白居易");
		queue.addFront("杜牧");
		queue.addFront("李商隐");
		out.println("队首元素是:"+queue.peek());
		while(!queue.isEmpty())
		{
			out.println(queue.remove());
		}
	}
}

运行结果:

队首元素是:李白
李白
杜甫
白居易
杜牧
李商隐

四,数组实现队列

采用数组来实现队列,定义两个变量front,rear分别指向队首和队尾,在队首删除元素,在队尾插入元素。但是简单的顺序队列会造成假溢出问题,解决这个问题的办法是采用循环队列,即将数组的头指针和尾指针连起来。
定义front,rear,maxSize(队列的容量)即数组大小
队列操作条件
队空:front=rear
队满:(rear+1)%maxSize = front
元素进队:rear = (rear+1)%maxSize
元素出队:front = (front+1)%maxSize

public class ArrayQueue<T> {
	private int front;//队首指针,表示出队的方向
	private int rear;//队尾指针,表示入队的方向
	private int maxSize;//表示队列的容量
	private Object[] data;//用来存储队列数据的Object数组
	
	/*队列操作条件
	 队空:front=rear
	 队满:(rear+1)%maxSize = front
	 元素进队:rear = (rear+1)%maxSize
	 元素出队:front = (front+1)%maxSize
	 * */
	
	public ArrayQueue(int size)
	{
		if(size>0)
			maxSize =size;
		maxSize++;		//很重要,因为循环队列中最大装入元素的个数是maxSize-1个
		data = new Object[maxSize];	//要想装入size个元素maxSize必须加一
		front = rear = 0;//front=rear表示队空
	}
	public ArrayQueue()
	{
		this(10);//队列默认大小为10
	}
	public boolean addFront(T myDate)
	{
		if(isFull())
			throw new RuntimeException("队列已满,无法再插入新数据!");
		data[rear] = myDate;
		rear = (rear+1)%maxSize;//入队条件
		return true;
	}
	@SuppressWarnings("unchecked")
	public T remove()
	{
		if(isEmpty())
			throw new RuntimeException("队列已空,无数据可以删除!");
		T olddata = (T) data[front];
		front = (front+1)%maxSize;//出队条件
		return olddata;
	}
	@SuppressWarnings("unchecked")
	public T peek()
	{
		if(isEmpty())
			throw new RuntimeException("队列已空,无法查看队首元素!");
		return (T) data[front];
	}
	public boolean isFull()
	{
		return (rear+1)%maxSize == front;//队满条件
	}
	public boolean isEmpty()
	{
		return front==rear;//队空条件
	}
}

五,测试

public class TestArrayQueue {
	public static void main(String[] args) {
		ArrayQueue<String> queue = new ArrayQueue<String>(5);
		queue.addFront("泰山");
		queue.addFront("华山");
		queue.addFront("衡山");
		queue.addFront("恒山");
		queue.addFront("嵩山");
		//queue.addFront("黄果树瀑布");
		while(!queue.isEmpty())
		{
			System.out.println(queue.remove());
		}
		System.out.println(queue.peek());
	}
}

运行结果:

泰山
华山
衡山
恒山
嵩山
Exception in thread "main" java.lang.RuntimeException: 队列已空,无法查看队首元素!

使用数组的方式也很好的实现了队列的基本功能,但是存在一个问题,就是我们必须事先知道队列的大小,跟数组一样无法动态扩展队列的容量,因此最佳的实现队列的办法还是采用前面实现的顺序表或者链表来实现。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页