Java中数据结构队列的使用2021-6-5

本文介绍了如何使用Java中的队列接口和LinkedList实现广度优先搜索(BFS)来计算有向图中两点间的最短距离。通过创建队列存储节点,使用HashMap记录节点与其到起点的距离,不断遍历和更新队列,直至找到目标节点或确定不存在路径。详细阐述了队列的各种操作,并展示了具体代码实现。
摘要由CSDN通过智能技术生成

Java中数据结构队列的使用

最近Java实验中要计算一个有向图中一个点到另一个点的距离(边的权值为1),显然要从出发点进行广度优先搜索,直到搜索到终点。我的想法是利用队列来完成。之前学数据结构时候都是先用C语言写一个队列的实现,然后在用这个队列。现在用Java,可以直接定义一个队列,实现队列的各种操作。
Queue<>是一个队列接口,因为队列是尾进头出,所以可以采用LinkedList来进行实现。

实验描述如下
实现并测试一个友谊图类,它在社交网络中表示友谊,并可以计算图中两个人之间的距离。getDistance方法应以两个人(作为人)作为参数,并返回人之间的最短距离(aint),如果两个人没有连接,则返回-1。
下面是我用队列的具体实现
a是起点,b是终点。
定义一个队列存放人。创建一个HashMap,以人作为key,value将要存放此人和出发点的距离。起点a加入到队列,在图中建立映射关系,a到a距离为i(i=0)。取队首元素,出队遍历找到队首的每个朋友,如果没在map中(即之前没有找到过)就将他入队,同时在map中增加此人和此人距出发点的距离(即他的上一个的距离+1)。找到终点b,返回距离。没有a到b的路径,返回-1

public int getDistance(Person a, Person b) {
		int i = 0;
		Queue<Person> queue = new LinkedList<>();//定义一个队列存放人
		HashMap<Person, Integer> map = new HashMap<>();//创建一个HashMap,以人作为key,value将要存放此人和出发点的距离
		queue.offer(a);//起点a加入到队列
		map.put(a, i);//在图中建立映射关系,a到a距离为i(i=0)
		//队列不空就一直执行
		while (!queue.isEmpty()) {
            Person top = queue.poll();//取队首元素,出队
			for (Person c : top.lsfriend()) {
				if(!map.containsKey(c)) {//遍历找到队首的每个朋友,如果没在map中(即之前没有找到过)
				queue.offer(c);//就将他入队
				map.put(c, map.get(top) + 1);//同时在map中增加此人,和此人距出发点的距离(即他的上一个的距离+1)
			    }
			if (top == b)
				return map.get(top);//找到终点,返回距离
		}
	}
		return -1;//没有路径,返回-1
	}

下面附上队列,链表的各种操作:
public boolean add(E e) 链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
public void add(int index, E element) 向指定位置插入元素。
public boolean addAll(Collection c) 将一个集合的所有元素添加到链表后面,返回是否成功,成功为 true,失败为 false。
public boolean addAll(int index, Collection c) 将一个集合的所有元素添加到链表的指定位置后面,返回是否成功,成功为 true,失败为 false。
public void addFirst(E e) 元素添加到头部。
public void addLast(E e) 元素添加到尾部。
public boolean offer(E e) 向链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
public boolean offerFirst(E e) 头部插入元素,返回是否成功,成功为 true,失败为 false。
public boolean offerLast(E e) 尾部插入元素,返回是否成功,成功为 true,失败为 false。
public void clear() 清空链表。
public E removeFirst() 删除并返回第一个元素。
public E removeLast() 删除并返回最后一个元素。
public boolean remove(Object o) 删除某一元素,返回是否成功,成功为 true,失败为 false。
public E remove(int index) 删除指定位置的元素。
public E poll() 删除并返回第一个元素。
public E remove() 删除并返回第一个元素。
public boolean contains(Object o) 判断是否含有某一元素。
public E get(int index) 返回指定位置的元素。
public E getFirst() 返回第一个元素。
public E getLast() 返回最后一个元素。
public int indexOf(Object o) 查找指定元素从前往后第一次出现的索引。
public int lastIndexOf(Object o) 查找指定元素最后一次出现的索引。
public E peek() 返回第一个元素。
public E element() 返回第一个元素。
public E peekFirst() 返回头部元素。
public E peekLast() 返回尾部元素。
public E set(int index, E element) 设置指定位置的元素。
public Object clone() 克隆该列表。
public Iterator descendingIterator() 返回倒序迭代器。
public int size() 返回链表元素个数。
public ListIterator listIterator(int index) 返回从指定位置开始到末尾的迭代器。
public Object[] toArray() 返回一个由链表元素组成的数组。
public T[] toArray(T[] a) 返回一个由链表元素转换类型而成的数组。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值