谈谈JAVA如何计算字符串公式
来源:互联网 发布:php中的正则表达式 编辑:程序博客网 时间:2024/06/04 17:46
因为最近忙着面试,也没太多时间分享自己的博客,但因为面试的过程中,碰到了几道类似的算法题,都是输入一个字符串数学公式,输出结果。自己整理了下,希望能和大家交流交流。我是利用谭浩强那本C语言上的算法写的,有不合理出,还喜欢大家批评指正。
import java.util.ArrayList;import java.util.List;import java.util.Stack;class InfixToSuffix{ /** * 遍历集合,是数字则入栈,碰到操作符,将数字出站,判断操作符,并执行相应的操作 * @param suffix * @return */ public static int getResult(ArrayList<String> suffix) { Stack<String> stack = new Stack<String>(); for(String element_suffix:suffix) { //如果是数字,入栈 if(Character.isDigit(element_suffix.charAt(0))) { stack.push(element_suffix); }else{ //如果遇到运算符,取出元素,并判断操作符,执行相应的计算 //自动拆箱:将包装类转换成基本类型 //自动装箱:将基本类型转换成包装类 int ANumber = Integer.valueOf(stack.pop());//自动拆箱,取出第一个元素 int BNumber = Integer.valueOf(stack.pop());//自动拆箱,取出第二个元素 int result = 0; switch (element_suffix) { case "+": result = ANumber+BNumber; break; case "-": result = ANumber-BNumber; break; case "*": result = ANumber*BNumber; break; case "/": result = ANumber/BNumber; break; default: break; } stack.push(result+""); } } return Integer.valueOf(stack.pop()); } /** * 将字符串转成集合 * @param str 待转的字符串 * @return */ public static ArrayList<String> getArrayList(String str) { ArrayList<String> stringList = new ArrayList<String>();//用于存储字符串集合 for(char chs:str.toCharArray()) { stringList.add(chs+""); } System.out.println("将字符串存入集合:"+stringList); return stringList; } /** * 比较当前运算符和栈顶运算符的优先级 * @param stackPeek 栈顶元素 * @param current 当前元素 * @return */ public static boolean getPriority(String stackPeek,String current) { if(stackPeek.matches("[\\*\\/]") && current.matches("[\\+\\-\\*\\/]")) { return true; }else if(stackPeek.matches("[\\+\\-]") && current.matches("\\+\\-")) { return true; } return false; } /** * 获得后缀表达式 * @param infix 传入的中缀表达式的集合 * @return */ public static ArrayList<String> getSuffix(ArrayList<String> infix) { ArrayList<String> suffix = new ArrayList<String>();//用于存储最后的后缀式 Stack<String> operator = new Stack<String>();//用于比较运算符优先级 //第一步:分离数字和运算符 for(String chs:infix) if(Character.isDigit(chs.charAt(0))) {//如果是数字,加入集合 suffix.add(chs); }else{ //如果不是数字,分离括号和运算符 switch (chs.charAt(0)) { //左括号直接入栈 case '(': operator.push(chs); break; //右括号,出栈,直到左括号出栈 case ')': while(!"(".equals(operator.peek())) suffix.add(operator.pop()); operator.pop();//左括号出栈 break; default: //如果是运算符,先比较优先级,如果当前元素的优先级低于栈顶元素,则栈顶元素出栈,当前元素出栈 //原则是保证栈顶元素的优先级最高 //如果栈顶元素优先级高,返回true,栈顶元素出栈,直到存在元素优先级低于当前元素 while(!operator.isEmpty() && getPriority(operator.peek(),chs)) suffix.add(operator.pop()); operator.push(chs);//优先级高的栈顶元素出栈后,加入优先级更低的元素 break; } } //判断栈中是否还有元素,有的话,取出 while(!operator.isEmpty()) suffix.add(operator.pop()); System.out.println("中缀式是:"+suffix); return suffix; }}
//testpublic class Demo { public static void main(String[] args) { // TODO Auto-generated method stub String str = "(2+3)*3+9*6/8+(2+4/3+(2+6/5))"; System.out.println(InfixToSuffix.getResult(InfixToSuffix.getSuffix(InfixToSuffix.getArrayList(str)))); }}
//result将字符串存入集合:[(, 2, +, 3, ), *, 3, +, 9, *, 6, /, 8, +, (, 2, +, 4, /, 3, +, (, 2, +, 6, /, 5, ), )]中缀式是:[2, 3, +, 3, *, 9, 6, *, 8, /, 2, 4, 3, /, 2, 6, 5, /, +, +, +, +, +]19
0 0
- 谈谈JAVA如何计算字符串公式
- java把字符串转化成公式计算
- java字符串类型的计算公式实现计算功能
- 字符串计算公式(zz)
- java 计算PMT公式
- java 公式计算
- java计算公式
- java 自定义公式计算
- java常用计算公式
- C#字符串计算公式处理
- java执行字符串公式
- jeval-java计算公式工具包
- OJ---数组计算公式java
- C#中字符串转换为计算公式
- C#中字符串转换为计算公式
- C# 字符串公式计算 (JScript.Eval 用法)
- 解析 简单的字符串计算公式
- C# 字符串转换为计算公式
- 黑马程序员---OC基础知识⑦
- Python爬虫Csdn系列III
- javascript基础笔记一数据类型
- 安卓最简单的aidl用两个程序模拟进程通信
- Android 定时器的三种实现
- 谈谈JAVA如何计算字符串公式
- 设计模式之代理模式学习二----普通代理----------《设计模式之禅》学习笔记
- cocos2d-x 3.3 之黑白棋设计 NO.1 初步设计
- NGUI控件说明(中文) UICamera
- 函数递归(求字符串的长度)
- 1.12
- 算数表达式求值
- 第六周项目一--深复制体验
- Matlab 常用命令