我正在研究一个问题,以检查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;
}
}
}
答案 0 :(得分:0)
如果要手动实现此算法,则应实现以下几个步骤:
例如
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)
有用于此的工具!
无需编写任何Java代码。只需将ANTLR用于以下语法即可。
是的,您的输入(0(1)1(2(0)0)2)0
以平衡方式通过。
ANTLR是一种语言识别工具。
使用ANTLR 4附带的TestRig
类通过控制台或文件输入您的值。如果您输入的数字字符串和括号没有正确平衡,则词法分析将发出错误信号。
我只是ANTLR的新手,但我an example(The Definitive ANTLR 4 Reference的创建者)根据Terence Parr中the 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的运行的ANTLR 4的屏幕截图。单击以放大。 ANTLR实际上是由控制台或Java代码驱动的。此处显示的插件代表我们处理该交互,因此我们可以在IDE中方便地工作。
{{3}}