• Java实现 蓝桥杯VIP 算法训练 删除多余括号


    算法训练 删除多余括号
    时间限制:1.0s 内存限制:512.0MB
    问题描述
      从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简。另外不考虑’+’  '-'用作正负号的情况,即输入表达式不会出现(+a)或(-a)的情形。
    输入格式
      表达式字符串,长度不超过255,  并且不含空格字符。表达式中的所有变量都是单个小写的英文字母, 运算符只有加+减-乘除/等运算符号。
    输出格式
      去掉多余括号后的表达式
    样例输入
    样例一:
    a+(b+c)-d
    样例二:
    a+b/(c+d)
    样例三:
    (a
    b)+c/d
    样例四:
    ((a+b)*f)-(i/j)

    样例输出

    样例一:
    a+b+c-d
    样例二:
    a+b/(c+d)
    样例三:
    a*b+c/d
    样例四:
    (a+b)*f-i/j

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		char[] chs = br.readLine().toCharArray();
    		List<Character> list = new ArrayList<Character>();
    		for (int i = 0; i < chs.length; i++) {
    			list.add(chs[i]);
    		}
    		String s = "";
    		for (int i = 0; i < func(list).size(); i++) {
    			s += list.get(i);
    		}
    		System.out.println(s);
    	}
    
    	public static List<Character> func(List<Character> list) {
    		for (int i = 0; i < list.size(); i++) {
    			if (list.get(i) == '+' || list.get(i) == '-') {
    				if (list.get(i - 1) == ')' && list.get(i + 1) == '(') {
    					list.remove(i - 1);
    					list.remove(i);
    					for (int j = i - 1; j > -1; j--) {
    						if (list.get(j) == '(') {
    							list.remove(j);
    							break;
    						}
    					}
    					for (int k = i + 1; k < list.size(); k++) {
    						if (list.get(k) == ')') {
    							list.remove(k);
    							break;
    						}
    					}
    				}
    				if (list.get(i - 1) == ')') {
    					list.remove(i - 1);
    					for (int j = i - 1; j > -1; j--) {
    						if (list.get(j) == '(') {
    							list.remove(j);
    							break;
    						}
    					}
    				}
    				if (list.get(i + 1) == '(') {
    					if (list.get(i) == '+')
    						for (int k = i + 1; k < list.size(); k++) {
    							if (list.get(k) == ')' && !list.contains('/') && !list.contains('*')) {
    								list.remove(k);
    								list.remove(i + 1);
    								break;
    							}
    						}
    				}
    			}
    		}
    		return list;
    	}
    }
    
    
  • 相关阅读:
    2019 ICPC Malaysia National H题
    欧拉定理证明
    P3384 【模板】树链剖分
    HDU 6070 Dirt Ratio(线段树、二分)
    51Nod 1571 最近等对(线段树、离线查询)
    51Nod 1781 Pinball(线段树、dp、离散化)
    51Nod 1494 选举拉票(权值线段树)
    51Nod 1766 树上的最远点对(欧拉序、lca、线段树区间合并)
    lintcode-179-更新二进制位
    lintcode-178-图是否是树
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13079067.html
Copyright © 2020-2023  润新知