比较两个不同的数据类型对?

时间:2019-03-15 19:48:17

标签: java arrays object stack

我正在研究一个问题,以检查Java中的括号是否平衡。

每个括号都具有一个类型,并且类型是随机整数。

(0(1)1(2(0)0)2)0

^这将被认为是平衡的。

我使用堆栈来实现这一点,但是对于我如何比较和/或配对值以补偿它们却感到困惑

这就是我现在所拥有的。

public class Parenthesis
{
private static final char OPEN = '(';
private static final char CLOSE = ')';

public static boolean isPair(char char1, char char2, int num1, int num2)
{
    if(char1 == OPEN && char2 == CLOSE && num1 == num2)
    {
        return true;
    }
    return false;
}

public static boolean checkBalanced(int[] p, boolean[] b)
{
    Stack storage = new Stack(b.length);

    for(int i=0; i<p.length; i++)
    {
        if(b[i]==false)
        {
           char o=OPEN;
           int numO=p[i];
           storage.push(o, numO);
        }
        else if(b[i]==true)
        {
            char c=CLOSE;
            int numC=p[i];
            if (storage.isEmpty() || 
!isPair(storage.popSymb(),c,storage.popNum(),numC))
            {
                return false;
            }
        }
    }
    if(storage.isEmpty())
    {
        return true;
    }
    else
        {
            return false;
        }
}
}

3 个答案:

答案 0 :(得分:0)

如果要手动实现此算法,则应实现以下几个步骤:

  1. 如果符号在方括号中,则将其推入堆栈。
  2. 如果符号是封闭的括号:
    • 如果堆栈不为空,并且堆栈中的最后一个符号为右括号,则只需弹出右括号即可。
    • 否则将堆栈中的闭合支架推入。
  3. 如果结果堆栈为空,则表达式是平衡的。

例如

public class Parenthesis {
private static final char OPEN = '(';
private static final char CLOSE = ')';

private static boolean checkBalanced(String str) {

    Stack<Character> storage = new Stack<>();

    char[] chars = str.toCharArray();
    for (char ch : chars) {
        if (ch == OPEN) {
            storage.push(ch);
        }

        if (ch == CLOSE) {
            if (storage.size() != 0 && storage.peek() == OPEN) {
                storage.pop();
            } else {
                storage.push(ch);
            }
        }
    }

    return storage.size() == 0;
}

public static void main(String[] args) {
    System.out.println(checkBalanced("(0(1)1(2(3)2)2)0"));
}

但是我建议您使用反向波兰语符号来实现此算法。 https://en.wikipedia.org/wiki/Reverse_Polish_notation http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm

答案 1 :(得分:0)

也许这段代码可以在某种程度上为您提供帮助:

import java.util.Stack;

import java.util.Stack;

public class Parenthesis {

    private static class Pair {

        private final char parenthesis;
        private final char number;

        Pair(String value) {
            this.parenthesis = value.charAt(0);
            this.number = value.charAt(1);
        }

        boolean canFormAPairWith(Pair pair) {
            if (parenthesis == ')') {
                return false;
            }
            return this.number == pair.number && pair.parenthesis == ')';
        }

    }

    public static void main(String[] args) {

        Stack<Pair> stack = new Stack<>();

        String example = "(0(1)1(2(0)0)2)0";
        for (String s : example.split("(?<=\\G.{2})")) {

            Pair currentPair = new Pair(s);
            if (!stack.isEmpty() && stack.peek().canFormAPairWith(currentPair)) {
                stack.pop();
            } else {
                stack.push(currentPair);
            }
        }

        System.out.println(stack.isEmpty());

    }
}

我并未针对所有案例进行测试,但对您的案例有效。

答案 2 :(得分:0)

tl; dr

有用于此的工具!

无需编写任何Java代码。只需将ANTLR用于以下语法即可。

是的,您的输入(0(1)1(2(0)0)2)0以平衡方式通过。

ANTLR 4

ANTLR是一种语言识别工具。

  • 第1阶段
    ,您向ANTLR提供了一个“语法”文件,该文件定义了编程语言(Java,C,COBOL等)或数据结构(XML,JSON,CSV等) ,而ANTLR为词法分析器和解析器生成Java源代码。
  • 第二阶段
    ,您可以编译这些源。然后运行这些类,提供要分析的源代码或数据文件。
    • Lexing
      处理字符流以标识以前称为 tokens 的单词。
    • 解析
      处理令牌流以标识句子(编程语言中的语句或数据文件中的行)。结果是Abstract Syntax Tree

使用ANTLR 4附带的TestRig类通过控制台或文件输入您的值。如果您输入的数字字符串和括号没有正确平衡,则词法分析将发出错误信号。

我只是ANTLR的新手,但我an exampleThe Definitive ANTLR 4 Reference的创建者)根据Terence Parrthe ANTLR project的语法Newline改编而成为你。

grammar ParenBalance;

prog:   stat+ ;

stat:   expr NEWLINE
    |   NEWLINE
    ;

expr:  expr expr
    |   INT
    |   '(' expr ')'
    ;

INT :   [0-9]+ ;         // match integers
NEWLINE:'\r'? '\n' ;     // return newlines to parser (is end-statement signal)
WS  :   [ \t]+  ;

尝试一些输入(全部带有ANTLR4 plugin,未显示):

  • 42通过
  • (42)通过
  • (42失败,缺少')'
  • 42)失败,输入')'
  • (((1)2)3)通过
  • ((1 2)3)失败,输入''不匹配,外部输入')'

让我们尝试输入。

  • (0(1)1(2(0)0)2)0通过。

这是通过IntelliJ IDE的screenshot of ANTLR 4 in action within IntelliJ IDE via the ANTLR4 plugin运行的ANTLR 4的屏幕截图。单击以放大。 ANTLR实际上是由控制台或Java代码驱动的。此处显示的插件代表我们处理该交互,因此我们可以在IDE中方便地工作。

{{3}}