右线性文法

来源:互联网 发布:stm32 串口读取数据 编辑:程序博客网 时间:2024/05/22 02:04

优酷笔试题

这里写图片描述

思路

用栈实现:
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;    }}
0 0
原创粉丝点击