2014华为校招机试高级题——if语法中的括号判断
来源:互联网 发布:开淘宝店自己做模特 编辑:程序博客网 时间:2024/06/13 04:33
package com.huawei.job; import java.util.ArrayList;import java.util.Scanner; public class IfJudge { public static void main(String[] args) { StringBuffer input = new StringBuffer(); Scanner in = new Scanner(System.in); input.append(in.nextLine()); System.out.println(new IfJudge().judge(input)); } //判断if语法:输入if语句没有嵌套,只需要判断括号是否使用正确 private StringBufferjudge(StringBuffer sb) { //保存答案 StringBuffer answ = new StringBuffer(); int leftMax = 0; //返回左边括号数 int rightMax = 0; //返回右边括号数 int left = 0; //暂存左边括号 int right = 0; //暂存右边括号 //新建一个栈 Stack stack = new Stack(); //把括号入栈 boolean flag = true; //判断是否正在输入字符或字符串 for(int i = 0; i < sb.length(); i++) { if(sb.charAt(i) == '\'' || sb.charAt(i) == '\"') { if(flag) flag = false; else flag = true; continue; } //不是字符串或字符中的括号才允许入栈 if(flag) if(sb.charAt(i) == '(' || sb.charAt(i) == ')') stack.push(sb.charAt(i)); } char tem; char outer = stack.pop(); //弹出第一个括号 if(outer != ')') //第一个括号不是右括号则语法错误 return sb.append("WRONG"); right++; rightMax++; //弹栈并判断 while((tem = stack.pop()) != 0) { //栈中还有括号则循环 if(tem == '(') { //弹出左括号 left++; leftMax++; } else { //弹出右括号 right++; rightMax++; } if(right > 0 && left > 0) { //弹出了左括号和右括号开始判断 if(right > left) { //正常情况下,右括号始终会大于左括号,直到最外层括号弹出 right -= left; left = 0; } if(right == left) { //正确情况下,左右括号数相同,说明最外层括号已弹出 if(stack.pop() == 0) { //如果括号已全部弹出,说明语法正确 return answ.append("RIGHT" + leftMax + " " + rightMax); } else //括号未弹出完毕,语法错误 return answ.append("WRONG"); } } } //未能正确弹出,则为语法错误 return answ.append("WRONG"); }} class Stack { //栈空间为一个字符型的链表 ArrayList<Character> chs = new ArrayList<Character>(); //入栈 public void push(char c) { chs.add(c); } //出栈 public char pop() { if(chs.size() > 0) { char c = chs.get(chs.size() - 1); chs.remove(chs.size() - 1); return c; } return 0; }}