【发布时间】:2022-01-20 16:41:56
【问题描述】:
我有以下代码,并希望让测试运行考虑下面“所需输出”的结果。特别是“!!!解析错误!结束标记和开始标记不匹配!”陈述。当“结束标签:”与“弹出的起始标签:”不匹配时,就会发生这种情况。我已经放置了以下代码来帮助解决这个问题,但我不确定 '!=' 运算符的另一侧是什么。
if(stack.pop() != )
{
System.out.println("!!!Parse Error! End Tag and Start Tag Mismatch!");
break;
}
期望的输出:
===> Test 3: <html> </head> </body> </html>
[<html>, </head>, </body>, </html>]
Beginning tag: <html>
Ending tag: </head>
Popped Starting tag: <html>
!!!Parse Error! End Tag and Start Tag Mismatch!
Test 3 all done!
代码:
class Main {
static String[] tests = {"<html> <head> </head> <body> </body> </html>","<html> </head> </body>","<html> <head> <title> </title> </head> <body> <h1> </h1> </body> </html>","<html> </head> </body> </html>"};
public static void main(String[] args) {
System.out.println("FEC-Stacks");
System.out.println("Code by Julian Blanco");
//System.out.println(tests.length);
for (int i = 0; i < tests.length; i++)
{
System.out.println("===> Test " + i + ": " + tests[i]);
String[] tags = tests[i].split(" ", 5);
System.out.println(java.util.Arrays.toString(tags));
java.util.Stack<String> stack = new java.util.Stack<String>();
for( i = 0; i < tags.length; i++)
{
if(tags[i] == "<html>" || tags[i] == "<head>" || tags[i] == "<body>")
{
stack.add(i,tags[i]);
System.out.println("Beginning tag: " + tags[i]);
}
else if(tags[i] == "</html>" || tags[i] == "</head>" || tags[i] == "</body>")
{
System.out.println("Ending tag: " + tags[i]);
System.out.println("Popped Starting tag: " + stack.pop());
if(stack.pop() != )
{
System.out.println("!!!Parse Error! End Tag and Start Tag Mismatch!");
break;
}
}
}
if(stack.isEmpty() == false)
{
System.out.println("!!!Parse Error!");
}
System.out.println("Test " + i + " all done!");
}
}
}
【问题讨论】:
-
您在 else if 语句中从堆栈中弹出标签两次。所以第一和第二流行不会给你相同的标签。从堆栈中弹出标签一次到一个字符串,然后使用这个字符串进行逻辑比较。 String poppedTag = stack.pop();
-
这有帮助。你知道'!='操作符的另一边应该是什么吗?
-
不能使用 == 来比较字符串。使用 stack.push 而不是 add。如果您只想检查堆栈顶部的内容,请使用 peek 而不是 pop。仅当您准备好将其从堆栈中移除时才弹出。
-
好点。所以我基本上是在尝试将“结束标签”与其对应的标签(比如 和 )进行比较。
-
我在想‘tags[i-1]’