• 计算表达式


    前言:

        表达式计算要考虑运算优先级问题,可以将数字和运算符存放到list内,然后进行相应的运算再输出。

    题目描述

    对于一个不存在括号的表达式进行计算 
    输入描述:
    存在多种数据,每组数据一行,表达式不存在空格


    输出描述:
    输出结果

    输入例子:
    6/2+3+3*4

    输出例子:
    18

     1 import java.util.ArrayList;
     2 import java.util.Scanner;
     3 
     4 public class 计算表达式 {
     5 
     6     public static void main(String[] args) {
     7         Scanner in = new Scanner(System.in);
     8         while (in.hasNext()) {
     9             ArrayList<Character> operator = new ArrayList<>(); // 存放运算符+、-
    10             ArrayList<Double> number = new ArrayList<>(); // 存放数字
    11             String exp = in.nextLine(); // 输入运算表达式
    12             double num = 0;
    13             int tmp;
    14             for (int i = 0; i < exp.length(); i++) { // 依次读取每一位的字符
    15                 switch (exp.charAt(i)) {
    16                 case '+':
    17                     operator.add('+');// 当遇到+的时候,将运算符+加入operator列表内
    18                     number.add(num); // 将上一位字符的数字加入number列表中
    19                     num = 0;
    20                     break;
    21                 case '-':
    22                     operator.add('-');
    23                     number.add(num);
    24                     num = 0;
    25                     break;
    26                 case '*':
    27                     tmp = getNumber(exp, i + 1); // 解析下一位的数字
    28                     num = num * tmp;
    29                     i += (tmp + "").length();
    30                     break;
    31                 case '/':
    32                     tmp = getNumber(exp, i + 1);
    33                     num = num / tmp;
    34                     i += (tmp + "").length();
    35                     break;
    36                 default:
    37                     // 解析当前字符位上的数字,如果数字是123这样连续的几位,会持续向下读并解析直到num=123解析完成为止
    38                     num = num * 10 + Integer.parseInt(exp.charAt(i) + "");
    39                     break;
    40                 }
    41             }
    42             number.add(num);  //将解析完的最后一位数字放入列表 
    43             //使用list的remove方法进行和队列的相似操作,将数字和运算符从头取出
    44             double result = number.remove(0);  
    45             while (operator.size() > 0) {
    46                 switch (operator.remove(0)) {
    47                 case '+':
    48                     result += number.remove(0);
    49                     break;
    50                 case '-':
    51                     result -= number.remove(0);
    52                     break;
    53                 }
    54             }
    55             System.out.println((int) result);
    56         }
    57         in.close();
    58     }
    59 
    60     /**
    61      * 获取下一个数字
    62      * @param exp 表达式
    63      * @param pos 当前位置
    64      * @return
    65      */
    66     static int getNumber(String exp, int pos) {
    67         int num = 0;
    68         while (!(pos >= exp.length() || exp.charAt(pos) > '9' || exp.charAt(pos) < '0')) { 
    69             // 保证下一位的数字合法,不是其他字符
    70             num = num * 10 + exp.charAt(pos) - '0';
    71             pos++;
    72         }
    73         return num;
    74     }
    75 
    76 }

      具体解析在注释里。                                                    by Still、

  • 相关阅读:
    4-vim-工作模式-01-职责以及切换模式
    3-vim-打开和新建文件-02-删除交换文件
    poj1011Stick(dfs+剪枝)
    POJ 1251 Jungle Roads (prim)
    poj 2502 Subway
    poj 3624 Charm Bracelet (01背包)
    拦截导弹问题(动态规划)
    Policy Gradient
    深入了解马尔科夫决策过程(Markov Decision Process)
    深度学习中调参对模型容量的影响
  • 原文地址:https://www.cnblogs.com/ygh1229/p/5803139.html
Copyright © 2020-2023  润新知