我正在编写一个代码,它将从文本文件中导入一串字符,使用堆栈分析字符串,并根据它是否符合某些规则来确定字符串所属的“语言”。下面的代码测试输入是否遵循模式(A ^ nB ^)^ p(其中n大于或等于0)。我编写的方法是将第一组A和B加载到堆栈上,然后将第二组A和B加载到另一个堆栈上,同时弹出两个堆栈并比较返回的值。如果它们匹配,则继续(直到两个堆栈同时为空),如果它们没有,则返回false。
public static boolean checkL4(File file) throws IOException
{
Stack stack1 = new Stack();
Stack stack2 = new Stack();
Stack stack3 = new Stack();
boolean firstCompare = true;
boolean bStart = false;
char w = 0;
try (Scanner sc = new Scanner(file).useDelimiter("\\s*"))
{
while (sc.hasNext()){
w = sc.next().charAt(0);
if (w == 0) {
return true;
}
if (w != 'A' && w != 'B')
{
return false;
}
if (w == 'A') {
if(!bStart) {
stack1.push(w);
stack3.push(w);
}
if(bStart && stack2.isEmpty()) {
stack2.push(w);
} else {
if (firstCompare) {
while (!stack1.isEmpty() || !stack2.isEmpty()) {
if (!stack1.isEmpty() && stack2.isEmpty())
{
return true;
}
if (stack1.isEmpty() && !stack2.isEmpty()) {
return false;
} else {
if (stack1.pop() == stack2.pop()) {
return true;
} else {
return false;
}
}
}
stack1.push(w);
firstCompare = false;
} else {
if(stack1.isEmpty()){
while (!stack3.isEmpty() || !stack2.isEmpty()) {
if (stack3.isEmpty() && !stack2.isEmpty()) {
return false;
} else {
if (stack2.isEmpty() && !stack3.isEmpty()) {
return false;
} else {
if (stack3.pop() == stack2.pop()) {
return true;
} else {
return false;
}
}
}
}
stack1.push(w);
}
if (stack3.isEmpty()){
while (!stack1.isEmpty() || !stack2.isEmpty()) {
if (stack1.isEmpty() && !stack2.isEmpty()) {
return false;
} else {
if (stack2.isEmpty() && !stack1.isEmpty()) {
return false;
} else {
if (stack1.pop() == stack2.pop()) {
return true;
} else {
return false;
}
}
}
}
stack1.push(w);
}
}
}
}
if (w == 'B') {
bStart = true;
if(bStart && stack2.isEmpty()) {
stack2.push(w);
}
if(bStart && !stack2.isEmpty()) {
if (!stack1.isEmpty()) {
stack3.push(w);
}
if(!stack3.isEmpty()) {
stack1.push(w);
}
}
}
}
}
return false;
}
此代码适用于大多数输入(对于AB和AABBBAABBB返回true,对BBAA返回false)但在某些情况下它应返回false(如ABBA和AABBCCD),它返回true。那么为什么对于回文案例和非A字母和非B字母的情况,它都会返回。我知道我在那里声明如果w(输入)不是和A而不是B,则返回false。这是用我写的类似方法工作的,为什么不用这个呢?如果两个返回的值不匹配,我也写了这个返回false(如果输入是回文,它们不应该返回)。
答案 0 :(得分:0)
我认为您应该使用.isEqual来比较两个字符串而不是使用==