我正在尝试编写一个程序,告诉我HTML文件中的所有标记是否均衡,因此每个<tag>
都有一个</tag>
。我此时并不担心自闭标签。我认为我会有所作为,但并不是很正确。它查看每个元素,而不是整体查找打开和关闭标记。谁能告诉我我做错了什么?
const string opening = "<*>";
const string closing = "</*>";
string input;
int main()
{
char element;
stack<char> stk;
ifstream file;
cout << "Please Enter File name: ";
cin >> input;
//std::file.open(input);
file.open(input.c_str());
if(file.fail())
cout<<"File is corrupt or does not exists!"<<endl;
while(!file.eof())
{
file>>element;
//push left group symbols onto stack
if(element==opening[0])
stk.push(element);
else if(element==opening[1])
stk.push(element);
else if(element==opening[2])
stk.push(element);
}
file.close();
file.open(input.c_str());
while(!file.eof())
{
file>>element;
if(stk.top()==opening[0])
{
if(element==closing[0])
stk.pop();
}
else if(stk.top()==opening[1])
{
if(element==closing[1])
stk.pop();
}
else if(stk.top()==opening[2])
{
if(element==closing[2])
stk.pop();
}
}
file.close();
if(!stk.empty())
cout<<"\nILLEGAL"<<endl;
else if(stk.empty())
cout<<"\nLEGAL"<<endl;
cout << "\n\nProgram complete." << endl;
return 0;
}
我对C ++很新,尤其是堆栈,所以请解释一下我可能会学到的答案。
答案 0 :(得分:0)
我发现了你的错误。你这样说:
if(stk.top()==opening[0])
{
if(element==closing[0])
stk.pop();
}
else if(stk.top()==opening[1])
{
if(element==closing[1])
stk.pop();
}
else if(stk.top()==opening[2])
{
if(element==closing[2])
stk.pop();
}
开启[0] ='&lt;'并关闭[0] ='&lt;'所以没关系。但不幸的是,这对其他角色来说并不适用:
打开[1] ='*'并关闭[1] ='/'
不幸的是,即使我将代码更改为:
if(stk.top()==opening[0])
{
if(element==closing[0])
stk.pop();
}
else if(stk.top()==opening[1])
{
if(element==closing[2])
stk.pop();
}
else if(stk.top()==opening[2])
{
if(element==closing[3])
stk.pop();
}
它仍然不起作用。我会进一步研究它。