+ - * / ( ) 四则运算表达式解析的初步实现
来源:互联网 发布: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());}}
- + - * / ( ) 四则运算表达式解析的初步实现
- Java实现四则运算的解析
- 四则运算表达式解析
- 解析表达式 四则运算
- Qt解析四则运算表达式
- 栈实现简单的四则运算表达式
- 四则运算表达式实现
- javascript中解析四则运算表达式的算法和示例
- 四则运算表达式的值
- Java实现四则运算表达式计算
- 正则表达式实现的加减乘除四则运算的计算器
- 利用逆波兰表达式(后缀表达式)解析四则运算表达式的详细源代码及解释
- 数据结构之简单四则运算表达式求值8-(栈的实现)
- C语言实现整数四则运算表达式的计算
- 编译原理---四则运算表达式的计算简单实现
- 使用Boost.Spirit实现四则运算字符串的解析
- 使用 正则表达式 解析四则运算式
- C# 四则运算表达式解析器分析
- socket 编程入门教程(一)TCP server 端:3、sockaddr与sockaddr_in
- Java笔记01——IO流
- Java笔记02——多线程
- 工作总结---PCB板子贴片问题
- 绘图基础--橡皮筋画线
- + - * / ( ) 四则运算表达式解析的初步实现
- Java笔记03——数据库JDBC
- js对文件及文件夹的操作
- LPTSTR、LPCSTR、LPCTSTR、LPSTR和CString
- toj 1153
- PostMessage和sendmessage的区别
- Android开发笔记——双屏互动
- RSRP,RSSI,RSRQ
- 面试系列一:简历之 简历包含哪些内容