我想知道下面的C#代码通过Hierholzer算法产生Euler Tour顶点索引有什么问题,假设所有顶点都有均匀度,所以巡视可以从任何地方开始:
(其中pt_id是表示由边组成的起点和终点索引的整数列表的列表)
PS。 GraphMatrix最初由以下项目组成,如果由于缺乏关于pt_id的信息而提供任何帮助:
n y y n y y n n n n n
y n n n y n n n n n n
y n n y y y n n n n n
n n y n n y n y y n n
y y y n n y n n n n n
y n y y y n n n n n n
n n n n n n n y y y y
n n n y n n y n y n y
n n n y n n y y n n y
n n n n n n y n n n y
n n n n n n y y y y n
代码:
Stack tempPath = new Stack();
ArrayList finalPath = new ArrayList();
int total = 11;//total number of nodes
string[] nodeList = new string [total];//to store the nodes
string[,] GraphMatrix = new string [total, total];//to store the edge representation of graph
//node/vertice to nodeList array
for(int i = 0; i < total; ++i) {
nodeList[i] = i.ToString();
}
//edge details in the graph(connectivity boolean matrix)
//matrix first filled with "n"
for(int i = 0; i < total; ++i) {
for(int j = 0; j < total; ++j) {
GraphMatrix[i, j] = "n";
}
}
//if connection exists, matrix item is changed to "y"
for(int i = 0; i < pt_id.Count; ++i) {
GraphMatrix[pt_id[i][0], pt_id[i][1]] = "y";
GraphMatrix[pt_id[i][1], pt_id[i][0]] = "y";
}
//start tour
int s = 0;
int ind = 0;
tempPath.Clear();
tempPath.Push(nodeList[0]);
while(tempPath.Count != 0 && s < 100) {
int index = 0;
while (tempPath.Peek().ToString() != nodeList[index] && s < 100) {
index++;
s++;
}
ind = index;
for(int i = 0; i < total; ++i) {
if(GraphMatrix[ind, i] != "y") {
finalPath.Add(tempPath.Pop());
}
else{
GraphMatrix[ind, i] = "n";
GraphMatrix[i, ind] = "n";
tempPath.Push(nodeList[i]);
}
}
s++;
}
我收到错误,说堆栈是空的。
非常感谢,
添
答案 0 :(得分:0)
看起来你想要在行
中浏览堆栈的所有元素 while (tempPath.Peek().ToString() != nodeList[index] && s < 100) {
但是Peek()
只返回堆栈顶部的元素而不删除它。因此,在该行中,您将比较堆栈顶部的元素与nodelist
中的元素。
要迭代堆栈中的所有元素,你可以
int index = 0;
foreach (var element in tempPath)
{
if (element.ToString() == nodelist[index] && s >= 100)
{
break;
}
else
{
index ++;
s++;
}
}
您的代码存在第二个问题。
在致电tempPath.Pop()
之前,您需要检查是否有任何项目,并执行您的算法所需的其他内容,而不是调用Pop()
。