我有这个问题,
编写一个函数来确定文本是否具有平衡的分隔符。有效的分隔符对是()、[]、{}和<>。它们可能是嵌套的。此外,确定文本分隔符"one_answers"是否正确匹配。
顺便说一句,我正在用java编程。。
对于每个测试行,如果它有平衡的分隔符,则输出为"1",否则输出为"0"。
下面的例子,
4 --- 0
{123} --- 1
{qweqwe{sdad} --- 0
问题是,我如何用java代码来检查这对有效的分隔符是否匹配?对不起,我对分隔符知之甚少。
下面是我的代码。。
public static void main(String args[]) {
String a1 = "";
try {
Scanner readFile = new Scanner(new File("2.in.txt"));
while (readFile.hasNextLine()) {
a1 = readFile.nextLine();
System.out.println(a1);
if (a1.equals("18")) {
System.out.println("0");
} else {
System.out.println("1");
}
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
return;
}
}
这个问题的一般解决方案是使用堆栈。对于每个输入字符串,从一个空堆栈开始:
- 当遇到开口支架时,将其推入堆栈
- 当遇到右括号时,从堆栈中弹出并与右括号进行比较,看看它们是否是匹配的一对。否则,返回
false
。如果是,请继续
完成对字符串的遍历后,请检查堆栈是否为空。如果是,则返回true
,否则返回false
。
对于引号'
和"
的情况,如果您不允许引号位于同一个引号内,并且您不考虑转义语法,那么解决方案应该是相同的。
看看这段代码,它解决了类似的任务。
import java.util.Stack;
class BracketChecker {
private String input;
public BracketChecker(String in) {
input = in;
}
public void check() {
Stack<Character> theStack = new Stack<Character>();
for (int j = 0; j < input.length(); j++) {
char ch = input.charAt(j);
switch (ch) {
case '{':
case '[':
case '(':
theStack.push(ch);
break;
case '}':
case ']':
case ')':
if (!theStack.isEmpty()) {
char chx = theStack.pop();
if ((ch == '}' && chx != '{') || (ch == ']' && chx != '[') || (ch == ')' && chx != '('))
System.out.println("Error: " + ch + " at " + j);
} else
System.out.println("Error: " + ch + " at " + j);
break;
default:
break;
}
}
if (!theStack.isEmpty()){
System.out.println("Error: missing right delimiter");
}
}
}
public class MainClass {
public static void main(String[] args) {
String input;
input = "[]]()()";
BracketChecker theChecker = new BracketChecker(input);
theChecker.check();
}
}
boolean symbolsBalanced(String delimiter){
String delimiters = "[]{}<>()";
String text = "{(){}(){()(()())}}";
Stack<Character> myStack= new Stack<Character>();
int length = delimiters.length();
left = new char[length/2];
right = new char[length/2];
for (int i=0; i<length/2; i++) {
left[i] = delimiters.charAt(i+i); //It will contain [,{,<,(
right[i] = delimiters.charAt(i+i+1); //It will contain ],},>,)
}
int tLen = text.length();
for (int i=0; i<tLen; i++) {
char c = text.charAt(i);
for(int j=0; j<left.length; j++) {
if(left[j]==c) {
//If start braces is present, add in stack
myStack.add(c);
break;
}
}
for(int j=0; j<right.length; j++) {
if(right[j]==c) {
//If stack is empty, then no use to continue the operation
if(myStack.isEmpty()) return false;
//If end braces is present, pop from stack
myStack.pop();
break;
}
}
}
if(myStack.isEmpty()) return true;
return false;
}