您的位置:首页 > 其它

2014华为校招机试高级题——if语法中的括号判断

2013-09-17 16:41 393 查看
http://blog.csdn.net/wy4649/article/details/11725073

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: