队列(queue)

队列(queue)

1、概念

队列(queue)简称队,它也是一种运算受限制的线性表,其限制一端只能进行插入,另一端进行删除。

插入数据元素的一端称为队列的队尾(rear)。

删除数据元素的一端称为队列的队首(front)。

向队尾插入元素称为进队或入队。

从队列中删除元素称为离队或出队。

队列的运算规则是先进先出规则(First In First Out,FIFO)。

队列的入、出队操作分别具有入队和出队指针,通常以f(front)表示队首指针,r(rear)表示队尾指针。

2、ADT定义

ADT Queue{
数据对象:D={ai|ai∈D0,i=0,1,2……n-1,D0为某一数据对象}
数据关系:R={<ai,ai+1>|ai,ai+1∈D,i=0,1,2,……n-2}
基本操作:
getSize();				//获取队列的大小,即元素的个数
isEmpty();				//判断是否为空,如果空返回true
enqueue(Object e);		//e入队
dequeue();				//队首元素出队。
peek();					//获取队首元素,但不出队
}

3、分类

队列的存储分为顺序存储和链式存储。

1.顺序队列

队列使用顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。

顺序队列也必须使用一个向量空间来存放当前队列中的元素。

由于队列的队头和队尾的位置是变化的,因为需要设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时可以置为0.

当头尾指针相等时队列为空。在非空队列里,头指针是中指向队头元素,而尾指针始终指向队尾元素的下一个位置。

队列同堆栈一样也有上溢和下溢现象。此外队列中还存在“假溢出”显现。

假溢出是指在入队和出队操作中,头尾指针不断增加而不减小或只减小而不增加,致使被删除元素的空间无法重新利用,最后造成队列中有空闲空间,但是不能插入元素,也不能够删除元素。

解决假溢出最好的方法是使用循环队列。

2.循环队列

存储在循环向量中的队列称为循环队列(Circular Queue)。逻辑图如下:

如果不做任何限制,逻辑上,空队列和满队列的条件是一样的,条件为front=rear。 所以这里就需要区分队列是队空还是队满。

区分队空队满可以采取以下几种方法:

  • 第一:设置浪费一个空间单元。
  • 第二:设定一个变量来表示队列中的元素个数。

3.链式队列

定义链式队列的存储结构基本和线性表的定义相同,不过需要在结构中指明的是队首和队尾的数据类型不再是整型而是指针类型。

队列的各种运算比链式存储的普通线性表运算实现时方便得多,主要原因是队列的各种运算只能在队列的两端操作,队列是特殊的线性表。主要考虑队列的入队和出队的算法。

4、应用

1.合并两个队列

假设有两个队列,要求将两个队列合并到一起,合并时交替使用两个队列中的元素,并把剩余队列汇总的元素添加到最后,将新产生的队列返回。

	public static Queue<Object> merge(ArrayDeque<Object> q1,ArrayDeque<Object> q2) {
		Queue<Object> newQueue=new ArrayDeque<>();
		while(!q1.isEmpty()&&!q2.isEmpty()) {
			newQueue.add(q1.pop());
			newQueue.add(q2.pop());
		}
		while(!q1.isEmpty()) {
			newQueue.addAll(q1);
			q1.clear();
		}
		while(!q2.isEmpty()) {
			newQueue.addAll(q2);
			q2.clear();
		}
		return newQueue;
}

上一篇:栈(Stack)

下一篇:数组和广义表

转载于:https://my.oschina.net/u/3754001/blog/2239968

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值