算法01-表达式求值

  1. 其实还有很多地方需要考虑,比如用户输入的数据进行校验,小伙伴儿们可以进行参考和修改

题目给出:本题主要是算法第四版上的一道题目
计算(1+((2+3)(45)))的值

解析:1.这道题,我们可以看到有操作数和操作符,我们可以利用两个栈来解决这个问题,一个操作数栈,一个操作符栈,分别为opertor,number。2.判断操作数出栈的条件是遇到 “)” 括号,遇到右括号就要进行操作符出栈(这里会遇到弹出的操作符不是我们想要的操作符,而是”(“ 这样我们就要将操作符栈再次出栈),对应的操作数栈相邻的两个操作数出栈,做算术表达式后进行再次入操作数栈。3.当操作数栈为空的时候,最后一次出操作数栈的就是我们计算得到的值。

直接上代码


package com.cxy.stack;

import java.util.Scanner;

import java.util.Stack;

public class ArithmeticExpression {

public static void main(String[] args){

    System.out.println("请输入一串带()+数字的算术表达式:例如(1+((2+3)*(4*5)))");

    Scanner scanner =new Scanner(System.in);

    String input = scanner.nextLine();

    System.out.println(input);

    //操作符栈

    Stack opertor =new Stack<>();

    //操作数栈

    Stack number =new Stack<>();

    //保存最终数据的

    double res =0;

    int index =0;

    int len = input.length();

    while(len>0){

      //index控制表达式的字符位置

      len--;

      //中间临时保存计算值

      String tempOperator =null;

      char ch = input.charAt(index);

      index++;

      if(ch =='+'|| ch =='-' || ch =='*' || ch =='/' || ch =='('){

        //如果是操作符,

        System.out.println("入操作符栈:"+ch);

        opertor.push(Character.toString(ch));

      }else if(ch !=')'){

        System.out.println("入操作数栈:"+ch);

        number.push(Double.parseDouble(Character.toString(ch)));

      }else if(ch ==')'){

        //遇到右括号,出操作符栈,并执行相应的number出栈

        System.out.println("遇到右括号");

        tempOperator = opertor.pop();

        //再出一次操作符栈将(括号去掉

        String leftKuo = opertor.pop();

        System.out.println("遇到右括号出栈的字符:"+tempOperator);

        System.out.println("将左括号去电"+leftKuo);

        //出第一个number

//        System.out.println("操作数右边的数:"+firstNumber);

        if(tempOperator.equals("+")){

          double firstNumber = number.pop();

          double lastNumber = number.pop();

          //计算之后将新得到的数字继续入数字栈

          System.out.println("加号左边出操作数:"+lastNumber);

          number.push(lastNumber+firstNumber);

          System.out.println("两边相加的操作数入栈:"+lastNumber+firstNumber);

          System.out.println("相加后的栈长度:"+number.size());

        }else if(tempOperator.equals("-")){

          //后出栈的减前面的

          double firstNumber = number.pop();

          number.push(number.pop()-firstNumber);

        }else if(tempOperator.equals("*")){

          double firstNumber = number.pop();

          double lastNumber = number.pop();

          System.out.println("乘号右边"+firstNumber);

          System.out.println("乘号左边"+lastNumber);

          number.push(lastNumber*firstNumber);

          System.out.println("相乘的两边的操作数入栈:"+firstNumber*lastNumber);

          System.out.println("相乘后的栈长度:"+number.size());

        }else if(tempOperator.equals("/")){

          double firstNumber = number.pop();

          //如果分母为0,提示错误

          if(firstNumber ==0){

            System.out.println("分母为0,无法计算");

break;

          }else

          number.push(number.pop()/firstNumber);

        }

}

}

    System.out.println("计算结果为:"+number.pop());

  }

}

最后输出结果

"C:\Program Files\Java\jdk1.8.0_162\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.4\lib\idea_rt.jar=50194:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_162\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_162\jre\lib\rt.jar;D:\IdeaWorkSpace\Algorithms\JinDianSuanFa\out\production\JinDianSuanFa;D:\mvnrep\junit\junit\4.12\junit-4.12.jar;D:\mvnrep\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.cxy.stack.Arithmetic
请输入一串带()+数字的算术表达式:例如(1+((2+3)*(4*5)))
(1+((2+3)*(4*5)))
(1+((2+3)*(4*5)))
入操作符栈:(
入操作数栈:1
入操作符栈:+
入操作符栈:(
入操作符栈:(
入操作数栈:2
入操作符栈:+
入操作数栈:3
遇到右括号
遇到右括号出栈的字符:+
将左括号去电(
加号左边出操作数:2.0
两边相加的操作数入栈:2.03.0
相加后的栈长度:2
入操作符栈:*
入操作符栈:(
入操作数栈:4
入操作符栈:*
入操作数栈:5
遇到右括号
遇到右括号出栈的字符:*
将左括号去电(
乘号右边5.0
乘号左边4.0
相乘的两边的操作数入栈:20.0
相乘后的栈长度:3
遇到右括号
遇到右括号出栈的字符:*
将左括号去电(
乘号右边20.0
乘号左边5.0
相乘的两边的操作数入栈:100.0
相乘后的栈长度:2
遇到右括号
遇到右括号出栈的字符:+
将左括号去电(
加号左边出操作数:1.0
两边相加的操作数入栈:1.0100.0
相加后的栈长度:1
计算结果为:101.0

Process finished with exit code 0

其实还有很多地方需要考虑,比如用户输入的数据进行校验,小伙伴儿们可以进行参考和修改


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1371769065@qq.com

文章标题:算法01-表达式求值

字数:1.5k

本文作者:一叶知秋

发布时间:2020-07-04, 15:34:09

最后更新:2020-07-04, 15:36:22

原始链接:http://yoursite.com/2020/07/04/arithmtic/01/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏

相册 github