C/C++数据结构与算法笔记7(队列应用题)

习题和部分笔记来自数据结构与算法 (王桂林)

 

习题1:舞伴问题

假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。规定每个舞曲能有一对跳舞者。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一个程序,模拟上述舞伴配对问题。

问题分析:先入队的男士或女士也应该先出队成为舞伴(根据队列的思想),将男和女的记录存放在一个数组中作为输入,依次扫描各元素,根据性别决定进入男队列还是女队列,当两个队列构造完成后,依次将两队当前的队头元素作为输出进行配对,直至某个队列为空,此时,若某队仍有未匹配者,作为下一轮待匹配者。

题目链接 http://acm.swust.edu.cn/#/problem/1027/341 ( 可在线测试,来自SWUST OJ 1027)

第一行男士人数m和女士人数n(1<=m,n<=100);
第二行舞曲的数目k(1<=k<=100)。

input:

4 3

6

output:

1 1

2 2

3 3

4 1

1 2

2 3

# include<stdio.h>
int main()
{
	int M[100];
	int F[100];
	int m, f, k;
	scanf("%d%d", &m, &f);
	scanf("%d", &k);
	for (int i = 1; i <= m; i++)
		M[i] = i;
	for (int j = 1; j <= k; j++)
		F[j] = j;
	for (int i = 1; i <= k; i++)
	{
		if (i <= m)
		{
			printf("%d", M[i]);

		}
		else
		{
			if (i % m == 0)
			{
				printf("%d", M[m]);
			}
			else
			{
				printf("%d", M[i % m]);
			}
		}
		if (i <= f)
		{
			printf("%d\n", F[i]);
		}
		else
		{
			if (i % f == 0)
			{
				printf("%d\n", F[f]);
			}
			else
			{
				printf("%d\n", F[i % f]);
			}
		}
	}
}

 

习题2 广度优先搜索的实现 (类似题型 https://leetcode-cn.com/tag/breadth-first-search/

习题3 实现树的层序遍历 (leetcode 102)

https://leetcode-cn.com/problems/binary-tree-level-order-traversal/


#include <vector>
#include <queue>
using namespace std;
#include <iostream>
void reverse_with_iterator(vector<vector<int>> vec);

 struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
};



class Solution {
public:
	/**
	 *
	 * @param root TreeNode类
	 * @return int整型vector<vector<>>
	 */
	vector<vector<int> > levelOrder(TreeNode* root) {
		// write code here
		vector<vector<int> > res;
		if (!root) return res;
		queue<TreeNode*> qu;
		qu.push(root);
		while (!qu.empty()) {
			int size = qu.size();
			vector<int> vec;
			while (size--) {
				TreeNode* node = qu.front();
				qu.pop();
				vec.push_back(node->val);
				if (node->left) qu.push(node->left);
				if (node->right) qu.push(node->right);
			}
			if (vec.size() > 0) res.push_back(vec);
		}
		return res;
	}
};

void reverse_with_iterator(vector<vector<int>> vec)
{
	if (vec.empty())
	{
		cout << "The vector is empty!" << endl;
		return;
	}

	vector<int>::iterator it;
	vector<vector<int>>::iterator iter;
	vector<int> vec_tmp;

	cout << "Use iterator : " << endl;
	for (iter = vec.begin(); iter != vec.end(); iter++)
	{
		vec_tmp = *iter;
		for (it = vec_tmp.begin(); it != vec_tmp.end(); it++)
			cout << *it << " ";
		cout << endl;
	}
}

int main()
{
	TreeNode a, b, c,d,e;
	TreeNode* root = &a;
	a.val = 3;
	b.val = 9;
	c.val = 20;
	d.val = 15;
	e.val = 7;
	a.left = &b;
	a.right = &c;
	b.left = &d;
	b.right = &e;
	c.right = NULL;
	c.left = NULL;
	d.right = d.left = e.right = e.left = NULL;
	Solution A;
	vector<vector<int> > resa;
	resa = A.levelOrder(root);
	reverse_with_iterator(resa);
	return 0;


}

待续。。。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值