有没有办法在 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】:

要实现这一点,您必须将堆栈顶部的标记与当前结束标记进行比较,但是您必须修改结束标记以与其起始对应项进行比较,因为&lt;/html&gt; 总是不同的比&lt;html&gt;,由于/(斜杠)字符。所以你必须去掉斜线,在比较结束标签和开始标签之前用""(一个空字符串)替换"/"

这是一个想法,如何在需要将结束标签与开始标签进行比较之前更改结束标签

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 语句

在 C++ 中将 bool 转换为文本

有没有办法可以缩短这个 if 语句?

有没有办法在反应中将 setState 导出到无状态组件之外?

用两个栈实现队列

有没有办法缩短这个 if 语句?