有没有办法在 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 可以帮助您更改代码并正确进行比较。如果他们不这样做,请在评论中告诉我。