+ - * / ( ) 四则运算表达式解析的初步实现

来源:互联网 发布:kpi绩效考核软件 编辑:程序博客网 时间:2024/05/22 11:56
如题:下列代码只实现了解析+ - * / ( ) 的简单的四则运算表达式的功能,而且操作符只能是双目的,单目不可以。实现的思路就是:通过逆波尔算法将中缀表达式转换为后缀表达式(其实这里我换成了前缀表达式),然后通过正则表达式匹配结果计算即可。
package Test;import java.util.Stack;public interface option {
//opStack:存放操作符的LIFO栈   nbls存放后缀表达式的LIFO栈void doJob(Stack<Character> opStack, Stack<String> nbls);
//计算两个数值的操作结果String getResult(String op1, String op2);}

此上代码声明了两个方法,方法一:逆波尔算法的辅助算法

方法二:计算结果的方法

package Test;import java.util.HashMap;import java.util.Map;import java.util.Stack;public enum yxjEnum implements option {// 若当前运算符为'(',直接入栈LEFT(1) {public void doJob(Stack<Character> opStack, Stack<String> nbls) {opStack.push('(');}@Overridepublic String getResult(String op1, String op2) {// TODO Auto-generated method stubreturn null;}},// 若为')',出栈并顺序输出运算符直到遇到第一个'(',遇到的第一个'('出栈但不输出RIGHT(4) {public void doJob(Stack<Character> opStack, Stack<String> nbls) {while (true) {if (opStack.empty()) {break;}Character c = opStack.pop();if (c != null) {if (c == '(') {break;} else {nbls.push(c + "");}} else {break;}}}@Overridepublic String getResult(String op1, String op2) {// TODO Auto-generated method stubreturn null;}},// 若为四则运算符,比较栈顶元素与当前元素的优先级:// 如果 栈顶元素运算符优先级 >= 当前元素的优先级,出栈并顺序输出运算符直到 栈顶元素优先级 < 当前元素优先级,然后当前元素入栈;// 如果 栈顶元素 < 当前元素,直接入栈。PLUS(3) {public void doJob(Stack<Character> opStack, Stack<String> nbls) {while (true) {Character c = null;if (!opStack.empty()) {c = opStack.pop();}if (c != null) {if (yxjEnum.yxjOpts.get(c).getYxj() >= yxjEnum.yxjOpts.get('+').getYxj()) {nbls.push(c + "");} else {opStack.push('+');break;}} else {opStack.push('+');break;}}}@Overridepublic String getResult(String op1, String op2) {return Integer.valueOf(op1) + Integer.valueOf(op2) + "";}},MIUS(3) {public void doJob(Stack<Character> opStack, Stack<String> nbls) {while (true) {Character c = null;if (!opStack.empty()) {c = opStack.pop();}if (c != null) {if (yxjEnum.yxjOpts.get(c).getYxj() >= yxjEnum.yxjOpts.get('-').getYxj()) {nbls.push(c + "");} else {opStack.push('-');break;}} else {opStack.push('-');break;}}}@Overridepublic String getResult(String op1, String op2) {return Integer.valueOf(op1) - Integer.valueOf(op2) + "";}},DIVSION(2) {public void doJob(Stack<Character> opStack, Stack<String> nbls) {while (true) {Character c = null;if (!opStack.empty()) {c = opStack.pop();}if (c != null) {if (yxjEnum.yxjOpts.get(c).getYxj() >= yxjEnum.yxjOpts.get('/').getYxj()) {nbls.push(c + "");} else {opStack.push('/');break;}} else {opStack.push('/');break;}}}@Overridepublic String getResult(String op1, String op2) {return Integer.valueOf(op1) / Integer.valueOf(op2) + "";}},MULTIPLY(2) {public void doJob(Stack<Character> opStack, Stack<String> nbls) {while (true) {Character c = null;if (!opStack.empty()) {c = opStack.pop();}if (c != null) {if (yxjEnum.yxjOpts.get(c).getYxj() >= yxjEnum.yxjOpts.get('*').getYxj()) {nbls.push(c + "");} else {opStack.push('*');break;}} else {opStack.push('*');break;}}}@Overridepublic String getResult(String op1, String op2) {return Integer.valueOf(op1) * Integer.valueOf(op2) + "";}};private int yxj;public static Map<Character, yxjEnum> yxjOpts = new HashMap<Character, yxjEnum>();static {yxjOpts.put('(', LEFT);yxjOpts.put(')', RIGHT);yxjOpts.put('+', PLUS);yxjOpts.put('-', MIUS);yxjOpts.put('*', MULTIPLY);yxjOpts.put('/', DIVSION);}private yxjEnum(int yxj) {this.yxj = yxj;}public int getYxj() {return this.yxj;}}

package Test;import java.util.Stack;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Nbl {private Stack<Character> ops = new Stack<Character>();private Stack<String> nbls = new Stack<String>();private String tempVal = "";private String reg = "[\\(\\)+-/\\*]{1}\\s\\d{1,}\\s\\d{1,}";private String desStr = "";public void parseNbl(String str){for(int i=0;i<str.length();i++){char val = str.charAt(i);if(yxjEnum.yxjOpts.get(val)!=null){if(tempVal!=null&&!"".equals(tempVal)){nbls.push(tempVal);tempVal="";}yxjEnum.yxjOpts.get(val).doJob(ops, nbls);}else{tempVal += val;}}}public String getResult(){while(!nbls.empty()){String s = nbls.pop();if(s.matches("[\\da-zA-Z]{1,}")){desStr += " "+s;}else{desStr += s;}}Pattern pattern = Pattern.compile(reg);Matcher m = pattern.matcher(desStr);String result = "";while(true){if(m.find()){String str = m.group(0);String[] strs = str.split("\\s");yxjEnum y = yxjEnum.yxjOpts.get(strs[0].charAt(0));result = yxjEnum.yxjOpts.get(strs[0].charAt(0)).getResult(strs[1], strs[2]);desStr = desStr.replaceFirst(reg, " "+result);m = pattern.matcher(desStr);}else{break;}}return desStr.trim();}public static void main(String[] args) {String str = "(11+3)*(4+22)";Nbl nbl = new Nbl();nbl.parseNbl(str);System.out.println(nbl.getResult());}}

原创粉丝点击