问题
编写一段程序,从标准输入得到一个缺少左括号的表达式并打印出补全括号之后的中序表达式。例如,给定输入:
1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )
你的程序应该输出:
( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )
解决思路
使用两个栈分别保存数值和操作符,分别为opr和data。顺序处理输入字符串的字符:
- 如果为操作符,压入opr。
- 否则,如果为右括号,从data取出两个操作数,从opr取出1个操作符,添加括号组合后压入data。
- 否则,为数字,压入data。
以上处理办法需要输出满足以下条件,也就是有如下的假设:
- 输入表达式是合法的。
代码
/** * Description : * Author : mn@furzoom.com * Date : Oct 20, 2016 9:26:55 AM * Copyright (c) 2013-2016, http://furzoom.com All Rights Reserved. */ package com.furzoom.lab.algs.ch103; /** * ClassName : E10309 <br> * Function : TODO ADD FUNCTION. <br> * date : Oct 20, 2016 9:26:55 AM <br> * * @version */ public class E10309 { public static String getCompleteExpression(String exp) { String[] params = exp.split(" "); Stack<String> oprStack = new Stack<String>(); Stack<String> dataStack = new Stack<String>(); for (int i = 0; i < params.length; i++) { if (isOperator(params[i])) { oprStack.push(params[i]); } else if (params[i].equals(")")) { String d1 = dataStack.pop(); String d2 = dataStack.pop(); String op = oprStack.pop(); dataStack.push("( " + d2 + " " + op + " "+ d1 + " )"); } else { dataStack.push(params[i]); } } return dataStack.pop(); } public static void main(String[] args) { String expression = "1 + 2 ) * 3 - 4 ) * 5 - 6 ) ) )"; String result = getCompleteExpression(expression); System.out.println(result); } private static boolean isOperator(String s) { return (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")); } }
结果
( ( 1 + 2 ) * ( ( 3 - 4 ) * ( 5 - 6 ) ) )