右线性文法
来源:互联网 发布: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
- 右线性文法
- poj 1126 Simply Syntax 右线性文法的归约
- 线性时间右移数组
- 线性布局下最左/右问题
- 文法
- 文法
- 左线性文法标示符识别的c++实现
- C# 线性复杂度 数组 循环右移
- 线性复杂度循环右移数组
- 线性布局控制控件居右显示
- Android gravity & layout_gravity,线性布局居右
- 最左推导和最右推导,语法树,二义性文法
- 编译原理(4)-----1型文法和线性界限自动机
- 线性布局下,如何最左或者最右
- 线性布局中两个控件,一个居右显示
- 乔姆斯基文法
- 乔姆斯基文法
- 简单文法
- @Repository、@Service、@Controller 和 @Component
- 贪心算法☞磁带最优存储问题
- bzoj 3262: 陌上花开 【cdq分治】
- jQuery EasyUI之Form表单提交
- Shell 批量更改主机名
- 右线性文法
- 古典密码之维吉尼亚密码破解思路
- 重新学javaweb---路径专题
- 监听器图库
- 安卓开发之java基础篇笔记【1】
- 《极简笔记》源码分析(二)
- LightOJ 1364 Expected Cards (概率DP)
- &&和||的优先级
- hibernate懒加载(lazy加载)