栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构、算法:程序 8-14 离线等价类程序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构、算法:程序 8-14 离线等价类程序

#include 
#include "arrayStack.h"
using namespace std;

int main()
{
	int n,                       // 元素个数
		r;                       // 关系个数

	cout << "输入元素个数" << endl;
	cin >> n;
	if (n < 2)
	{
		cout << "元素太少" << endl;
		return 1;                // 因错误而终止
	}

	cout << "输入关系数量" << endl;
	cin >> r;
	if (r < 1)
	{
		cout << "关系数量太少" << endl;
		return 1;                // 因错误而终止
	}

	// 建立空栈组成的数组,stack[0]不用
	arrayStack* list = new arrayStack [n + 1];

	// 输入 r 个关系,存储在表中
	int a , b;    // (a, b) 是一个关系
	for (int i = 1; i <= r; i++)
	{
		cout << "输入下一个关系/对" << endl;
		cin >> a >> b;
		list[a].push(b);       // 这里开始我也不明白,手动模拟下
		list[b].push(a);       // 比如 (3, 4)list[4]=4,list[5]=3,(4, 5)list[5]=5,list[6]=4
		                       // 这样list[5]的位置为(3, 5)
	}

	// 初始化输出等价类
	arrayStack unprocessedList;
	bool* out = new bool[n + 1];        // out[1:n+1] 都为 false
	for (int i = 1; i <= n; i++)
		out[i] = false;

	// 输出等价类
	for (int i = 1; i <= n; i++)
		if (!out[i])                    // 若没有输出过,则是一个新的等价类的开始
		{// 启动一个新类
			cout << "下一个类是: " << i << " ";
			out[i] = true;
			unprocessedList.push(i);
			// 从 unprocessedList 中取类的剩余元素
			while (!unprocessedList.empty()) // 若堆栈不为空,还有属于这个等价类的元素
			{
				int j = unprocessedList.top();
				unprocessedList.pop();

				// 表 list[j] 中的元素属于同一类
				while (!list[j].empty())
				{
					int q = list[j].top();
					list[j].pop();
					if (!out[q])
					{
						cout << q << " ";
						out[q] = true;
						unprocessedList.push(q);
					}
				}
			}
			cout << endl;
		}
	cout << "结束" << endl;
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/588685.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号