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

#include <iostream>
#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<int>* list = new arrayStack<int> [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<int> 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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值