队列(Java)

队列(Java)

队列

队列是一种具有先进先出(FIFO)特点的集合了类型。
队列的应用性很广泛,这里就不一一赘述了。

与栈相似,队列也是一种操作受限的线性表,不同的是队列只允许在线性表的尾部进行插入操作,在线性表的头部进行删除操作,因此其特点为先进先出(FIFO)。
我们将能够进行插入操作的一端称为队尾(rear),能够进行删除操作的一端称为队头(front),队列中没有元素时,称为空队列。

我们先用图形来解释一下什么是“队列”吧。
包子铺早上刚刚开始营业。
有一名顾客走了进来。
在这里插入图片描述
店铺老板还没有将顾客1的包子准备好,又走进来了几个人,大家都自发地排起了队。
在这里插入图片描述
当1号顾客的包子包好之后,他就会离开,老板再为2号顾客准备。在这里插入图片描述
之后再来的顾客将会依次排在队伍的最后面,当老板将包子打包好之后,队伍最前面的顾客就会离开队伍。
其实这个队伍就是一个队列,最前面的顾客就是队首元素,最后面的顾客就是队尾元素,同时我们也发现了队列的特点:先进先出(FIFO,First In First Out)。

顺序队列

建立顺序队列结构必须为其申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。

循环队列

在实际使用队列时,为了使队列空间能重复使用,往往对队列的使用方法稍加改进:无论插入或删除,一旦rear指针增1或front指针增1时超出了所分配的队列空间,就让它指向这片连续空间的起始位置,从而形成一个环,这就是循环队列。从MaxSize-11变到0,可用取余运算rear%MaxSizefront%MaxSize来实现。

顺序队列的实现(链表)

下面我们进行顺序队列的实现,由于循环队列与顺序队列实现方法基本相同,此处不再阐述。

顺序队列的API

队列(FIFO)
Queue()创建一个空队
void enqueue(Item item)入队
Item dequeue()出队
boolean isEmpty()判断栈是否为空
int size()栈中元素数量
1.Queue()
public void Queue() { }
2.boolean isEmpty()
public boolean isEmpty() {
	return first == null;
}
3.int size()
public int size() {
	return N;
}
4.void enqueue(Item data)
public void enqueue(Item item) {
	Node oldlast = last;
	last = new Node();
	last.item = item;
	last.next = null;
	if (isEmpty())
		first = last;
	else
		oldlast = last;
	N++;
}
5.Item dequeue()
public Item dequeue() {
	Item item = first.item;
	first = first.next;
	if (isEmpty())
		last = null;
	N--;
	return item;
}

完整代码如下

public class Queue<Item> {
	private Node first;
	private Node last;
	private int N;
	
	private class Node {  
		Item item;
		Node next;
  
		public Node() {//创建结点
		}
  
		public Node(Item data, Node next) {//创建指定数据以及指向的结点
			this.data = data;
			this.next = next;
		}
	}
	
	public boolean isEmpty() {
		return first == null;
	}
	
	public int size() {
		return N;
	}
	
	public void enqueue(Item item) {
		Node oldlast = last;//存储原来的队尾结点
		last = new Node();//构建新的队尾结点
		last.item = item;
		last.next = null;
		if (isEmpty())
			//若队空  队首指向队尾结点
			first = last;
		else
			//队尾结点指向旧队尾结点
			oldlast = last;
		N++;//队的大小变大
	}

	public Item dequeue() {
		Item item = first.item;//出队
		first = first.next;//更改队首结点指向
		if (isEmpty())
			//队空  队尾结点赋空
			last = null;
		N--;//队大小变小
		return item;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值