zoukankan      html  css  js  c++  java
  • 计算表达式

    前言:

        表达式计算要考虑运算优先级问题,可以将数字和运算符存放到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、

  • 相关阅读:
    Asp.Net MVC4入门指南(3):添加一个视图
    Asp.Net MVC4入门指南(2):添加一个控制器
    Asp.Net MVC4入门指南(1): 入门介绍
    .net平台借助第三方推送服务在推送Android,IOS消息(极光推送_V2版本)
    ASP.NET网站实现中英文转换(本地化资源)
    .net 内置对象之Session对象和Session的过期时间
    SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程
    Js键盘事件全面控制,回车按键事件,键盘对应按键码,按键事件兼容各个浏览器。
    C# WebBrowser控件详解
    html .net 网页,网站标题添图标
  • 原文地址:https://www.cnblogs.com/ygh1229/p/5803139.html
Copyright © 2011-2022 走看看