#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;
}
数据结构、算法:程序 8-14 离线等价类程序
最新推荐文章于 2023-10-01 11:46:41 发布