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) 返回一个由链表元素转换类型而成的数组。