字符串的四则运算

  • 字符串的四则运算
    • 实现思路
    • 代码实现

字符串的四则运算

作者:小江江

实现思路

首先构思实现需要用到的方法记录下来,之后进行具体的实现(先想后写)。

我的思路:
1.编写需要用到的帮助方法,判断是否为数字、运算符、括号、格式,等等。
2.将运算符在字符串的位置存入TreeMap(有序的)中,key存放索引位置、value存放运算符。
3.将TreeMap中的键存入List中(需要用到List中的get(i)方法),然后根据运算符的索引获取运算符前后的数字进行运算(需要考虑优先级),将运算完的项移除,循环运算直到字符串中不存在运算符,最后返回结果。

代码实现

package com.xiao.sf;import org.junit.jupiter.api.Test;import java.util.*;/**
不求无功,但求无过,谢谢。* 四则运算,使用循环+字符串截取+ascll码实现*/
public class SZUtil {/*** 测试ascll码*/public void sh(){char aa='+',bb='-',x='*',y='/',u='(',t=')';int cc=aa,dd=bb,f=x,z=y,n=u,v=t;System.out.println((char) 45);System.out.println("+:"+cc+"  -:"+dd+"*:"+f+"  /:"+z+" (:"+n+" ):"+y);}/*** 编写一个方法用来判断是否是四则运算符(四则运算符:加减乘除)* @param c* @return*/public boolean isSz(char c){int ascll=c;if (ascll==43 || ascll==45 || ascll==42 || ascll==47){return true;}return false;}/*** 判断是否是正负整数* @param c* @return*/public boolean isNum(char c){if (((int)c>47 && (int)c<58) || (int)c==45){return true;}return false;}/*** 判断是否是括号 (  )* @param c* @return*/public boolean isKh(char c){if (c=='(' || c==')'){return true;}return false;}/*** 判断是否是数字或者运算符和小括号* @param str* @return*/public boolean pdAll(String str){//定义一个字符串用了返回结果boolean result=true;char[] bytes = str.toCharArray();//判断是否只包含运算符和数字for (int i=0;i<str.length();i++){char u=bytes[i];if (isKh(u) || isNum(u) || isSz(u)){}else {result=false;break;}}return result;}/*** 运算规则判断,(并且判断了数字或者运算符和小括号)* @param str* @return*/public boolean ysgz(String str){//判断是否符合运算规则if(pdAll(str)){//判断前后括号的位置 比如:)1*2 或者 1*3(if (str.charAt(0)!=')' && str.charAt(str.length()-1)!='('){for (int i=0;i<str.length();i++){//获取运算符的位置if (isSz(str.charAt(i))){//判断运算符是否在第一个位置if (i>0 && i<str.length()-1){//判断运算符前是否是数字或者括号char aa=str.charAt(i-1);if (isNum(aa) || isKh(aa)){//判断运算符后是否是数字或者括号char bb=str.charAt(i+1);if((isNum(bb) && (int)bb!=45) || isKh(bb)){}else {return false;}}else {return false;}}else {System.err.println("首尾不能存在运算符");return false;}}}}else {System.err.println("首尾括号异常");return false;}}else {return false;}return true;}/*** 括号格式为完整的括号格式* @param str* @return*/public boolean khgs(String str){//判断是否存在括号boolean flag=false;for (char c:str.toCharArray()) {if(isKh(c)){flag=true;break;}}if (flag){Map<Integer,Character> map=new TreeMap<>();//获取所有括号for (int i=0;i<str.length();i++){//得到括号的位置if (isKh(str.charAt(i))){map.put(i,str.charAt(i));}}//判断括号是否存在残缺的if (map.size()%2==0){List<Integer> list=new ArrayList(map.keySet());//判断首尾括号的朝向 比如  )(if (map.get(list.get(0))=='(' && map.get(list.get(list.size()-1))==')'){//判断左右括号是否对称int left=0;int right=0;for (Integer key:list) {if (map.get(key)=='('){left+=1;}else if (map.get(key)==')'){right+=1;}else {System.err.println("错误");}}if (left==right){}else {System.err.println("左右括号的数量不同");return false;}}else {System.err.println("首尾括号的朝向不对");return false;}}else {System.err.println("括号数量不对");return false;}}return true;}/*** 帮助计算的方法* @param num1  第一个数* @param num2  第二个数* @param ysf   运算符* @return*/public int sumOO(String num1,String num2,String ysf){int sum=0;switch (ysf){case "*":sum=Integer.parseInt(num1)*Integer.parseInt(num2);break;case "/":sum=Integer.parseInt(num1)/Integer.parseInt(num2);break;case "+":sum=Integer.parseInt(num1)+Integer.parseInt(num2);break;case "-":sum=Integer.parseInt(num1)-Integer.parseInt(num2);break;default:System.err.println("程序异常");break;}return sum;}/*** 计算(不带括号的正整数)* @param str* @return*/public String sum1(String str){//判断格式if (ysgz(str)){//不断重复计算,直到结果出来为止while (true){//拿到运算符的位置,存入TreeMap中Map<Integer,Character> map=new TreeMap<>();for(int i=0;i<str.length();i++){if (isSz(str.charAt(i))){map.put(i,str.charAt(i));}}//运算符的位置List<Integer> list=new ArrayList<>(map.keySet());//乘除的标志  0 代表没有乘除运算符  ||  1 代表存在乘除运算符int ccCont=-1;//遍历运算符出现的位置,进行运算操作for (int i=0;i<list.size();i++) {//根据运算法则 先算乘除 后算加减  "1+3-4*5/5"if (map.get(list.get(i))=='*' || map.get(list.get(i))=='/'){ccCont=1;//当运算符是第一个或最后一个的时候,截取的方式也有所不同if (i==0 || i==(list.size()-1)){//当乘除运算符在第一个位置时  例如: "2*3+3/3"if (i==0){//截取数据String substring = str.substring(0, list.get(i));String substring1 = str.substring(list.get(i)+1,list.get(i+1));int i1 = sumOO(substring, substring1, map.get(list.get(i)) + "");str=i1+""+str.substring(list.get(i+1));break;//return i1+"";//出现在最后一个位置时}else {//截取数据String substring = str.substring(list.get(i-1)+1, list.get(i));String substring1 = str.substring(list.get(i)+1);int i1 = sumOO(substring, substring1, map.get(list.get(i)) + "");str=str.substring(0,list.get(i-1)+1)+""+i1;break;}}else {//截取指定位置的数据String substring = str.substring(list.get(i-1)+1, list.get(i));String substring1 = str.substring(list.get(i)+1, list.get(i+1));//运算int i1 = sumOO(substring, substring1, map.get(list.get(i)) + "");//将计算完的项移除,重新拼接strstr=str.substring(0,list.get(i-1)+1)+""+i1+""+str.substring(list.get(i+1));break;}}else {ccCont=0;}}if (ccCont==0){//通过第一个运算符的位置,拿到第一个数String sds = str.substring(0, list.get(0));for (int i=0;i<list.size();i++){String substring;if (i<list.size()-1){substring= str.substring(list.get(i)+1, list.get(i+1));}else {substring= str.substring(list.get(i) + 1);}int i1 = sumOO(sds, substring, map.get(list.get(i)) + "");sds=i1+"";}return sds;}// break;}}return "格式不对";}/*** 计算(带括号的正整数)* @param str* @return*/public String sum2(String str){//判断格式if (ysgz(str)){//判断括号if (khgs(str)){//反复查找运算符,直到没有运算符为止while (true){//判断括号的位置//拿到运算符的位置,存入TreeMap中Map<Integer,Character> map=new TreeMap<>();//将括号的位置存入map中  key 存放索引,value:存放括号  例如:{0=(,5=)}for(int i=0;i<str.length();i++){if (isKh(str.charAt(i))){map.put(i,str.charAt(i));}}//运算符的位置List<Integer> list=new ArrayList<>(map.keySet());for(int i=0;i<list.size();i++){//判断是否只存在最外面的一对括号if (list.size()==2){int index=0;//拿到运算符所在的位置for (int aa=0;aa<str.length();aa++){if (isSz(str.charAt(aa))){index=aa;break;}}//组装数据String num1=str.substring(1,index);String num2=str.substring(index+1,str.length()-1);String yuns=str.substring(index,index+1);//调用没有括号的求值方法String s = sum1(str.substring(1, str.length() - 1));/*System.out.println(str);System.out.println(num2);System.out.println(yuns);*///返回结果return s/*sumOO(num1,num2,yuns)+""*/;}else{//根据运算规则有括号先算括号里面的if (map.get(list.get(i))==')'){//截取String substring = str.substring(list.get(i - 1), list.get(i) + 1);//调用没有括号的进行运算String s = sum1(substring.substring(1, substring.length() - 1));//没作用 str=str.replaceAll(substring,s);//重新拼接str,继续运算str=str.substring(0,list.get(i-1))+s+str.substring(list.get(i)+1);break;}}}}}}return "格式错误";}//测试@Testpublic void t1(){String str="1*2+30-4*5/5*5";System.out.println(sum1(str));String str1="(1+(1+1)*(60+3+1*2)+33)";System.out.println(sum2(str1));}
}

字符串的四则运算-小江江相关推荐

  1. mysql做四则运算_MySQL字符串进行四则运算以及比较

    在mysql当中,字符串类型间进行加减乘除运算的时候,会截取字符串以数字开头的那一部分数字进行运算,如果字符串前面没有数字,那么就只能截取的数值为0,那么进行加减的时候结果都是0,进行乘除的时候结果都 ...

  2. c语言输入字符串做四则运算,C++字符串四则运算实例讲解

    15 { 16 if (num[i] >= '0'&&num[i] <= '9') 17 { 18 num2[i] = num[i]-48;//char转换成int 19 ...

  3. 神经网络算法是黑盒_在黑盒内窥视如何欺骗神经网络

    神经网络算法是黑盒 Neural networks get a bad reputation for being black boxes. And while it certainly takes c ...

  4. python123数字形式转换_【Python系统学习02】数据类型与类型转换

    数据类型与类型转换 一.数据类型 字符串 整数 浮点数 [补充中...] 1.字符串 str 字符串:英文string,简写str. name = '小石头:' print(name,'2019', ...

  5. C# 实现DataTable、DataSet与XML互相转换

    /** <summary>/// 把DataSet.DataTable.DataView格式转换成XML字符串.XML文件/// </summary>public class ...

  6. 零基础Python知识点回顾(一)

    如果你是小白,建议只要安装官网的python-3.7.0-amd64.exe 然后在电脑cmd命令提示符  输入检查是否已经安装pip,一般安装了python都会有的. >pip         ...

  7. javascript基础系列:javascript中的变量和数据类型(一)

    javascript基础系列:javascript中的变量和数据类型(一) 今天开始去重新系统温习一遍js基础,并作下记录 javascript是由三部分组成: ECMASCRIPT(ES): 描述了 ...

  8. 九月十月百度,迅雷,华为,阿里巴巴,最新校招笔试面试六十题

    九月迅雷,华为,阿里巴巴,最新笔试面试十题 8月15日,百度2道面试题: 1.来自<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球:的     i .每次从通里面 ...

  9. 最新校招笔试面试六十题

    原文: 九月十月百度,迅雷,华为,阿里巴巴最新校招笔试面试六十题(11.05) 链接:http://blog.csdn.net/v_july_v/article/details/11921021 分类 ...

最新文章

  1. java 安装多版本_一台电脑安装多个版本的jdk
  2. 帝国cms7.5多终端刷新单条内容信息时不起作用的解决方法
  3. 爱说说技术原理:与TXT交互及MDataTable对Json的功能扩展(二)
  4. CV Code | 本周新出计算机视觉开源代码汇总(含自动驾驶目标检测、医学图像分割、风格迁移、语义分割、目标跟踪等)...
  5. javascript实现页面滚屏效果
  6. win7 nginx php 环境,win7下docker环境搭建nginx+php-fpm+easyswoole+lavarel开发环境
  7. electron 的窗口设置最大化 最小化
  8. 系统子系统_GPRS子系统流程图
  9. MySQL-快速入门(14)MySQL性能优化
  10. fbinstool linux iso,大神给你传授fbinsttool下载 【操作教程】 的详细_
  11. 黑马程序员之Web前端全栈 · 阶段一 前端开发基础 (1)
  12. 无人机系统测试软件,无人机航测软件(pix4D)
  13. 2020-10-28-Requests及爬虫清单
  14. 将整数翻译成英文(C++)
  15. mysql的驱动_注册驱动MySQL的驱动程序
  16. 智能测试实践之路-UI 缺陷检测
  17. ExcelVBA:利用SUMIF和OFFSET+MATCH进行多条件求和
  18. 苹果股价盘后涨超5% 市值一度突破万亿
  19. 用LU_ASR语音控制板和Arduinonano做一个桌面老婆(1)
  20. 【OCR技术】大批量构造中文文字训练集

热门文章

  1. 雷锋微视点:Facebook竟以股价论英雄
  2. ping不通Linux服务器怎么办?
  3. Vue-脚手架初始化电商后台
  4. 主流定时任务解决方案全横评
  5. SQL查询的艺术学习笔记--数据插入操作
  6. 查看sybase IQ的执行计划
  7. POJ 3666 Making the Grade 笔记
  8. oracle 查询本年12月,ORACLE 写一条Sql语句查出年份,1月,2月,3月....12月的订单总数列表...
  9. 处理RGB和索引图像的函数
  10. android自定义水平长方形进度条,Android 自定义水平进度条的圆角进度