有没有办法在 if 语句中将 stack.pop() 与数组(比如 'tags')进行比较?
Is there a way to compare stack.pop() to an array (say 'tags') in an if statement?
我有以下代码,希望测试 运行 考虑下面 'desired output' 的结果。特别是“!!!解析错误!结束标记和开始标记不匹配!”陈述。当 'Ending tag: ' 与 'Popped Starting tag: ' 不匹配时会发生这种情况。我已经放置了以下代码来帮助解决这个问题,但我不确定 '!=' 运算符的另一边是什么。
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!");
}
}
}
为此,您必须将堆栈顶部的标签与当前结束标签进行比较,但是您必须修改结束标签以使其与其起始对应标签相比较,因为 </html>
总是不同于 <html>
,因为 /
(斜杠)字符。因此,在比较结束标记和开始标记之前,您必须去掉斜杠,将 "/"
替换为 ""
(空字符串)。
这是一个想法,如何在需要将结束标记与开始标记进行比较之前更改结束标记
String endTag = tags[i]
String comparableEndTag = endTag.replaceAll("/", "")
另请注意,在 Java 中,如果要比较字符串的字符是否相等,则必须使用 someString.equals(otherString)
,因为 ==
比较引用 - 它会检查是否这是同一个实例。由于 Java 的字符串实习,在某些情况下 ==
可以处理字符串,但该主题超出了此处的范围。所以使用 .equals()
.
stack.pop().equals(comparableEndTag)
如果您想检查栈顶而不弹出(移除)其中的值,请使用 peek()
而不是 pop()
。
// peek() to not pop the value from the stack already on this line
System.out.println("Popped Starting tag: " + stack.peek());
当你用值 5
作为第二个参数调用 tests[i].split(" ", 5);
时(第二个参数是限制),这意味着你只希望最多 limit - 1
发生分裂(即split(String regex, int limit)
方法的文档中有解释)。在您的情况下,当标签可能不止 5 个时,将 0 用作第二个参数,以便您拆分所有空格,而不仅仅是前 4 个。
您的外部 for 循环和内部 for 循环使用相同的计数器变量 i
。这可能不是故意的。
希望这些 ideas/hints 可以帮助您更改代码并正确进行比较。如果他们不这样做,请在评论中告诉我。
我有以下代码,希望测试 运行 考虑下面 'desired output' 的结果。特别是“!!!解析错误!结束标记和开始标记不匹配!”陈述。当 'Ending tag: ' 与 'Popped Starting tag: ' 不匹配时会发生这种情况。我已经放置了以下代码来帮助解决这个问题,但我不确定 '!=' 运算符的另一边是什么。
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!");
}
}
}
为此,您必须将堆栈顶部的标签与当前结束标签进行比较,但是您必须修改结束标签以使其与其起始对应标签相比较,因为 </html>
总是不同于 <html>
,因为 /
(斜杠)字符。因此,在比较结束标记和开始标记之前,您必须去掉斜杠,将 "/"
替换为 ""
(空字符串)。
这是一个想法,如何在需要将结束标记与开始标记进行比较之前更改结束标记
String endTag = tags[i]
String comparableEndTag = endTag.replaceAll("/", "")
另请注意,在 Java 中,如果要比较字符串的字符是否相等,则必须使用 someString.equals(otherString)
,因为 ==
比较引用 - 它会检查是否这是同一个实例。由于 Java 的字符串实习,在某些情况下 ==
可以处理字符串,但该主题超出了此处的范围。所以使用 .equals()
.
stack.pop().equals(comparableEndTag)
如果您想检查栈顶而不弹出(移除)其中的值,请使用 peek()
而不是 pop()
。
// peek() to not pop the value from the stack already on this line
System.out.println("Popped Starting tag: " + stack.peek());
当你用值 5
作为第二个参数调用 tests[i].split(" ", 5);
时(第二个参数是限制),这意味着你只希望最多 limit - 1
发生分裂(即split(String regex, int limit)
方法的文档中有解释)。在您的情况下,当标签可能不止 5 个时,将 0 用作第二个参数,以便您拆分所有空格,而不仅仅是前 4 个。
您的外部 for 循环和内部 for 循环使用相同的计数器变量 i
。这可能不是故意的。
希望这些 ideas/hints 可以帮助您更改代码并正确进行比较。如果他们不这样做,请在评论中告诉我。