感谢下面的提示
•你需要一次遍历字符串一个字符(for循环或while循环)当你点击<你知道你已经打了一个标签,所以存储这个角色的位置
•继续前进(最好是在子循环中),直到你点击>这是你的结束标记
•现在检查>之前的字符。是/?
•是:窥视堆栈顶部。该字符串是否与<之间的字符串相同。和/>?
如果是,请弹出该项并突破子循环(您找到了匹配!)。
如果不是,则从方法返回false - 您的工作已完成(HTML无效)。
•NO:然后将整个字符串推到<和>进入堆栈并突破此子循环,并继续主循环。 正如@seesharper建议的那样,将上面的内容转换为伪代码然后转换为C#。 祝你在学习编程的过程中好运!
答案 0 :(得分:2)
您当前的代码只是检查“{open}”是否完整,并且无论下一个标记是什么,都是完整的,而不是它与其关闭标记配对。
您需要使用字符串而不是字符进行操作。您将阅读“{open}”和“{/ open}”,您需要对它们进行操作。
首先列出您的用例:
您从一个关闭标记开始 - 弄清楚如何识别它是一个关闭标记,然后当您尝试弹出空堆栈时,您知道它未能通过检查。
您从一个开放标签开始 - 弄清楚如何识别它是一个开放标签,然后将其推入您的堆栈。
您会找到一个“完整标记” - 一种格式为“” - 确定如何识别此类标记。什么都不做,一旦被正确识别就不需要配对。
您会连续遇到多个打开的标签。将每个人推到堆栈上。
您遇到一个关闭标记 - 确定它是否与堆栈的顶部元素正确配对 - 如果它们已正确配对则弹出并继续 - 如果不匹配则失败。
您会连续遇到多个关闭标记。冲洗并重复5,直到标签不匹配或您有一个空的堆栈和无与伦比的关闭。
您当前的代码中有很多良好的逻辑,但需要进行扩展以正确执行分配的任务。
注意:我故意不提供代码,但有一些逻辑可以帮助您解决问题,因为这是一项家庭作业。您将几乎专门工作1)阅读文件。 2)字符串。 3)堆栈。如果需要查找它们,可以随时获得每种语法,属性和方法的资源。
另外,我使用了错误的大括号,因为只是标签没有显示,而且是一个快速编辑。
答案 1 :(得分:1)
这是我对问题的分析(我不打算给你解决问题的代码,因为其他人已经指出这会破坏这种练习的目的)。我也没有处理格式不一致(但仍然有效)的HTML和开放式标记特殊情况,例如<br />
,它们在实际HTML中很常见:
您需要一次遍历字符串一个字符(for
循环
或者while
循环)当你点击<
时,你知道你已经打了一个标签,所以
存储此角色的位置
继续前进(最好是在子循环中),直到你点击>
为止
你的结束标记
现在检查>
之前的字符。是/
吗?
是:窥视堆栈顶部。该字符串是否与<
和/>
之间的字符串相同?
<
和>
之间的整个字符串推到堆栈上
打破这个子循环,继续主循环。正如@seesharper建议的那样,将上面的内容转换为伪代码然后转换为C#。
祝你的学习计划好运!