优酷笔试题
思路
用栈实现:
1、在输入1*0*0*1*
这样的,#入栈
2、在输入(,|,,直接入栈。在输入 |时候需要判断,前一个必须是#
3、在输入)时候弹出栈,把(。。。)之间的全部弹出,()中应该是#|#|#|#|#这种间隔状的,出栈之后把#入栈。
4、在输入不为上面几种情况时,判断不符合该文法。
代码
package third;
import java.util.Stack;
import javax.lang.model.element.Element;
public class TestUtils {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String s = "))))0010*";
System.out.println(JudgeRegx(s));
}
public static int JudgeRegx(String s) throws Exception {
// 请在此添加代码
Stack<Character> space = new Stack<Character>();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if (ch == '(') {
space.push('(');
} else if (ch == ')') {
if (space.isEmpty()) return 0;
char pop = space.pop();
if (pop != '#') return 0;
while (pop != '(') {
char peek = space.peek();
if (pop == '#') {
if (peek == '(') {
space.pop();
if (!space.isEmpty() && space.peek() != '#') {
space.push('#');
} else if (space.isEmpty()) {
space.push('#');
}
break;
} else if (peek != '|') {
return 0;
}
} else if (pop == '|') {
if (peek != '#') return 0;
} else {
return 0;
}
pop = space.pop();
}
} else if (ch == '|') {
if (space.isEmpty()) return 0;
char top = space.peek();
if (top != '#') {
return 0;
} else {
space.push('|');
}
} else if (ch == '*') {
if (space.isEmpty()) return 0;
char top = space.peek();
if (top != '#') {
return 0;
}
} else if (ch == '0' || ch == '1') {
if (space.isEmpty()) {
space.push('#');
} else {
char top = space.peek();
if (top != '#') {
space.push('#');
}
}
} else {
return 0;
}
}
if (!space.isEmpty()) {
char pop = space.pop();
if (pop != '#') {
return 0;
}
if (space.isEmpty()) {
return 1;
}
while (!space.isEmpty()) {
char peek = space.peek();
if (pop == '#') {
if (peek != '|') {
return 0;
}
} else if (pop == '|') {
if (peek != '#') {
return 0;
}
} else {
return 0;
}
pop = space.pop();
if (space.isEmpty()) {
if (pop == '#') return 1;
}
}
}
return 0;
}
}