有没有办法在 if 语句中将 stack.pop() 与数组(比如“标签”)进行比较? [关闭]
Posted
技术标签:
【中文标题】有没有办法在 if 语句中将 stack.pop() 与数组(比如“标签”)进行比较? [关闭]【英文标题】:Is there a way to compare stack.pop() to an array (say 'tags') in an if statement? [closed] 【发布时间】: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]’ 【参考方案1】:要实现这一点,您必须将堆栈顶部的标记与当前结束标记进行比较,但是您必须修改结束标记以与其起始对应项进行比较,因为</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());
当您调用 tests[i].split(" ", 5);
并将值 5
作为第二个参数(第二个参数是限制)时,这意味着您只希望发生 limit - 1
拆分(这在 @ 的文档中进行了解释) 987654338@ 方法)。在您的情况下,当标签可能不止 5 个时,请使用 0 作为第二个参数,以便您拆分所有空格,而不仅仅是前 4 个。
您的外部 for 循环和您的内部 for 循环使用相同的计数器变量 i
。这可能不是故意的。
希望这些想法/提示可以帮助您更改代码并正确进行比较。如果他们没有,请在 cmets 中告诉我。
【讨论】:
以上是关于有没有办法在 if 语句中将 stack.pop() 与数组(比如“标签”)进行比较? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 VB.Net 中突出显示 If - End If 语句