ACM舞会配对:队列原理与C++实现

需积分: 8 0 下载量 98 浏览量 更新于2024-09-04 收藏 424KB PDF 举报
本文档深入探讨了队列的基本原理,并通过实例展示了如何在C++编程中运用队列数据结构。队列是一种在计算机科学中常用的数据结构,它遵循先进后出(First In Last Out, FIFO)的原则,支持在队尾进行插入操作(入队,push),在队首进行删除操作(出队,pop)。队列通常有两个关键指针,队尾指针r和队首指针f,它们分别指示新插入的元素位置和待删除的元素位置。 队列的定义明确指出,队列允许在队尾(rear)添加元素,队首(front)移除元素,这意味着新的元素总是添加到队尾,而最先添加的元素将在队列的最后被删除。初始化队列时,可以使用C++标准库中的`std::queue`或自定义数组实现,如文中提到的`queue<int> vis1, vis2`用于存储男士和女士。 文章中给出了队列的几种基本操作,包括: 1. 初始化队列:`vis.push(x)`用于向队列末尾添加元素。 2. 出队操作:`vis.pop()`移除并返回队首元素。 3. 队列是否为空的检查:`vis.empty()`判断队列是否为空。 4. 队列元素数量的获取:`vis.size()`返回队列中元素个数。 5. 获取队首元素:`vis.front()`获取队首元素但不移除。 针对实际问题,例如周末舞会舞伴配对,文档提供了具体的应用场景。在这个例子中,使用了两个队列`vis1`和`vis2`分别存储男士和女士。在每轮舞曲开始时,从两个队列的队首取出一对舞伴进行配对,然后将他们放回队尾,确保下一轮还有机会。这个过程通过`vis1.push(s1); vis2.push(s2);`实现。 此外,还介绍了使用数组实现队列的方法,通过`push`和`pop`函数,以及维护队列的长度和头尾指针,模拟队列的行为。这种方法适合在内存有限的情况下,当队列的大小不会超过预设的上限`maxn`时。 总结来说,这份文档不仅介绍了队列的基础概念、操作方法,还通过具体编程实例展示了队列在解决实际问题中的应用,对于学习和理解队列在算法设计中的作用非常有帮助。无论是理论基础还是编程实践,都为读者提供了丰富的学习资源。

程序执行提示AttributeError: 'point_cloud_generator' object has no attribute 'widthself',优化程序class point_cloud_generator(): def __init__(self, rgb_file, depth_file, save_ply, camera_intrinsics=[784.0, 779.0, 649.0, 405.0]): self.rgb_file = rgb_file self.depth_file = depth_file self.save_ply = save_ply self.rgb = cv2.imread(rgb_file) self.depth = cv2.imread(self.depth_file, -1) print("your depth image shape is:", self.depth.shape) self.width = self.rgb.shape[1] self.height = self.rgb.shape[0] self.camera_intrinsics = camera_intrinsics self.depth_scale = 1000 def compute(self): t1 = time.time() depth = np.asarray(self.depth, dtype=np.uint16).T # depth[depth==65535]=0 self.Z = depth / self.depth_scale fx, fy, cx, cy = self.camera_intrinsics X = np.zeros((self.width, self.height)) Y = np.zeros((self.width, self.height)) for i in range(self.width): X[i, :] = np.full(X.shape[1], i) self.X = ((X - cx / 2) * self.Z) / fx for i in range(self.height): Y[:, i] = np.full(Y.shape[0], i) self.Y = ((Y - cy / 2) * self.Z) / fy data_ply = np.zeros((6, self.width * self.height)) data_ply[0] = self.X.T.reshape(-1)[:self.widthself.height] data_ply[1] = -self.Y.T.reshape(-1)[:self.widthself.height] data_ply[2] = -self.Z.T.reshape(-1)[:self.widthself.height] img = np.array(self.rgb, dtype=np.uint8) data_ply[3] = img[:, :, 0:1].reshape(-1)[:self.widthself.height] data_ply[4] = img[:, :, 1:2].reshape(-1)[:self.widthself.height] data_ply[5] = img[:, :, 2:3].reshape(-1)[:self.widthself.height] self.data_ply = data_ply t2 = time.time() print('calcualte 3d point cloud Done.', t2 - t1)

2023-05-24 上传