我有两天试图让我的程序工作,这确实是一个家庭作业,并认为我的算法应该是正确的,使用堆栈检查标签是否平衡。如果有人知道代码有什么问题,我将不胜感激。这就是现在的样子:
public class HtmlParser {
private Stack<String> tagstack; // stack to collect only "<" characters.
public HtmlParser() {
tagstack = new Stack<String>();
}
private void processClosedTag(Scanner in) {
tagstack.pop();
in.next();
}
private void processOpenTag(Scanner in) {
tagstack.push(in.next()); // "<"
}
public boolean isCorrectlyNested(Scanner in) {
boolean isBalanced = false;
while(in.hasNext()) {
if(in.hasNext("<"))
processOpenTag(in); //and recurse until "/>"
else if(in.hasNext(">"))
processClosedTag(in);
}
if(tagstack.isEmpty())
isBalanced = true;
return isBalanced;
}//isCorrectlyNested
}//class
当我使用“in”扫描程序对象并调用此类中的方法时,控制台中没有任何事情发生它只读取我写的内容但是没有任何反应它甚至没有返回我写的语句:< / p>
if(parser.isCorrectlyNested(input))
System.out.println("Correctly Nested!");
else
System.out.println("Need to nest properly");
这当然是我使用HtmlParser实例“解析器”的主要方法。
答案 0 :(得分:3)
如果下一个项目既不小于或大于符号,您也永远不会移动扫描仪的位置。考虑下一个字符是否是某种字母数字字符串。你的while循环永远不会返回,因为如果它不是它正在寻找的东西,它永远不会真正移过字符串,所以你的方法永远不会返回,你的输出永远不会被执行。
答案 1 :(得分:0)
如前所述,如果您没有将扫描仪移动到其他角色,那么&lt;或者&gt;。另一点也是你没有结束条件(你可能想要在第一行之后退出)。第三个问题是,只要你遇到比已经打开过的字符更多的结束字符,你就会得到一个空的堆栈异常......
答案 2 :(得分:0)
作为对算法的一般观察,它将允许声明<html>
,它与</html>
的结束标记不平衡。这是预期的行为吗?它似乎不会。
无论如何,正如@odie之前所述,如果它不是一个尖括号,你的循环将不会移过任何东西。但是这个缺陷比这更深 - 考虑你的堆栈算法:
如果我看到HTML标记,那么它应该被压入堆栈。
如果我看到一个结束HTML标记,和它与当前位于堆栈顶部的标记匹配,那么我应该弹出[堆栈的第一个元素]。
这是lexical analysis的原则;您正在寻找匹配的令牌。您不能依赖尖括号为您提供上下文。
答案 3 :(得分:0)
只想发布问题的解决方案。因此,那些参与问题的人最终可以看到它的结果,谢谢。
公共类HtmlParser {
private Stack<Character> tagstack; // stack to collect only "<" characters.
public HtmlParser() {
tagstack = new Stack<Character>();
}
public boolean isCorrectlyNested(String str) {
boolean isBalanced = false;
String s = str.trim();
for(int i = 0; i < s.length(); i++) {
if(str.charAt(i) == '<')
tagstack.push('<');
if(str.charAt(i) == '>') {
if (tagstack.isEmpty())
return isBalanced;
else
tagstack.pop();
}
}
if(tagstack.isEmpty())
isBalanced = true;
return isBalanced;
}//isCorrectlyNested
}