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;    }} 


原创粉丝点击