Java实现表达式计算求值
问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
package com.liuzhen.systemExe;
import java.util.Scanner;
import java.util.Stack;
public class Main{
    //计算表达式的值
    public void getExpressionValue(String A){
        char[] arrayA = A.toCharArray();
        Stack<Integer> Value = new Stack<Integer>();      //存放运算数字及表达式计算结果
        Stack<Character> Operator =  new Stack<Character>();   //存放运算符
        for(int i = 0;i < A.length();i++){
            int temp = 0;
            if(arrayA[i] >= '0' && arrayA[i] <= '9'){
                temp = arrayA[i] - '0';
                i = i + 1;
                while(i < A.length() && arrayA[i] >= '0' && arrayA[i] <= '9'){
                    temp = temp * 10 + (arrayA[i] - '0');
                    i++;
                }
                i--;     //对应上面一句i = i+1;因为在for循环中有i++自增操作,若不执行此句,会导致i自增两次
                Value.push(temp);
            }
            else{
                if(Operator.empty()){
                   Operator.push(arrayA[i]);
                }
                else{
                    char temp1 = Operator.pop();   //进栈前,存放运算符栈中栈顶存放字符
                    int judge = comparePriority(temp1,arrayA[i]);  //比较当前字符与栈顶字符优先级
                    if(judge == 1){           //当前字符优先级小于栈顶字符
                        int tempA = Value.pop();
                        int tempB = Value.pop();
                        int result = computeNumber(tempB,tempA,temp1);
                        Value.push(result);
                        Operator.push(arrayA[i]);
                    }
                    if(judge == 0){           //当前字符优先级大于栈顶字符
                        Operator.push(temp1);
                        Operator.push(arrayA[i]);
                    }
                    if(judge == 2){  //字符')'遇到'(',刚好使得'('出栈
                        System.out.println("'('刚好遇到')'");   //这种情况也应该不会出现,按照给定优先级,')'一般会先遇到+、-、*、/字符
                    }
                    if(judge == 3){   //此时')'刚好准备进栈
                        while(temp1 != '('){          //')'字符要等到第一个'('出栈才能结束循环
                            //System.out.println(temp1);
                            int tempA = Value.pop();
                            int tempB = Value.pop();
                            int result = computeNumber(tempB,tempA,temp1);
                            Value.push(result);
                            temp1 = Operator.pop();
                        }
                    }
                    if(judge == -1){    //此时,说明当前栈顶字符为')',这是不存在的,因为遇到')',按要求不让进栈
                        System.out.println("出现栈顶有')'错误!!!");
                    }
                }
            }
        }
        while(!Operator.empty() && !Value.empty()){   //此时,字符栈中还存在运算符的情况
            char temp1 = Operator.pop();
            int tempA = Value.pop();
            int tempB = Value.pop();
            int result = computeNumber(tempB,tempA,temp1);
            Value.push(result);
        }
        System.out.println(Value.pop());   //此时运算符栈为空,数字栈中只存在表达式计算最终结果
    }
    //计算a operator b的值,operator = {+,-,*,/}
    public int computeNumber(int a,int b,char operator){
        int result;
        switch(operator){
        case '+':
            result = a+b;
            break;
        case '-':
            result = a-b;
            break;
        case '*':
            result = a*b;
            break;
        case '/':
            result = a/b;
            break;
        default:
            result = 0;
            break;
        }
        return result;
    }
    //判断运算符a和b的优先级
    public int comparePriority(char a,char b){
        //使用二维数组表达运算符之间的优先级,行用字符a表示,列用字符b表示
        int[][] Value = {{1,1,0,0,0,3},
                {1,1,0,0,0,3},
                {1,1,1,1,0,3},
                {1,1,1,1,0,3},
                {0,0,0,0,0,2},
                {-1,-1,-1,-1,-1,-1}};
        int i = 0;
        int j = 0;
        if(a == '+')
            i = 0;
        if(a == '-')
            i = 1;
        if(a == '*')
            i = 2;
        if(a == '/')
            i = 3;
        if(a == '(')
            i = 4;
        if(a == ')')
            i = 5;
        if(b == '+')
            j = 0;
        if(b == '-')
            j = 1;
        if(b == '*')
            j = 2;
        if(b == '/')
            j = 3;
        if(b == '(')
            j = 4;
        if(b == ')')
            j = 5;
        return Value[i][j];
    }
    public static void main(String[] args){
        Main test = new Main();
        Scanner in = new Scanner(System.in);
        System.out.println("请输入一个算法表达式:");
        String A = in.nextLine();
        test.getExpressionValue(A);
    }
}
运行结果:
请输入一个算法表达式:
1-2+3*(4-5)
-4
请输入一个算法表达式:
1-2*((2+3)*2-(2+3))
-9
请输入一个算法表达式:
1-2*((2+3)*(2+3))
-49
Java实现表达式计算求值的更多相关文章
- 算法笔记_044:表达式计算求值(Java)
		目录 1 问题描述 2 解决方案 1 问题描述 问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的 ... 
- C语言对表达式的求值顺序不是明确规定的
		讨论区看到的 WA来自那些递归下降求解的代码. 第一种情况,使用|| 和 &&: 例如s为所给串 int getval() { switch(s[c_s++]) { case 'p': ... 
- C++ 中缀转后缀表达式并求值
		//中缀转后缀 #include<iostream> #include<stack> using namespace std; int prio(char x){ ; ; ; ... 
- 中缀表达式转逆波兰式(后缀表达式)求值 C++ Stack
		给一个包含小数的中缀表达式 求出它的值 首先转换为后缀表达式然后利用stack求出值 转换规则: 如果字符为'(' push else if 字符为 ')' 出栈运算符直到遇到‘(' else if ... 
- Dijkstra的双栈算术表达式的求值算法
		例如需要计算 ( 1 + ( ( 2 + 3 ) * ( 4 * 5 ) ) ) 我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的: 表 ... 
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
		#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ... 
- 《C++反汇编与逆向分析技术揭秘》——观察各种表达式的求值过程
		---恢复内容开始--- 加法: 示例: 常量相加,则在编译期间就计算出两个常量相加后的结果,直接将这个结果参与运算,减少了运行期的计算.当有变量参与运算时,会先取出内存中的数据,放入通用寄存器中,再 ... 
- C/C++ 语言中的表达式求值(原文作者:裘宗燕)
		经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ... 
- ZT C,C++表达式求值顺序 裘老的解释。 [问题点数:300分]
		http://bbs.csdn.net/topics/370153775 [置顶] [推荐] C,C++表达式求值顺序 裘老的解释. [问题点数:300分] 最近这问题有从日经变时经的趋势,这里贴出裘 ... 
随机推荐
- [hdu4585]离线,并查集
			题意:把一些数加到集合里面,每个数有两个属性,分别是编号和值,加进去之前询问集合里面距离自己“最近”的数的编号.最近的意思是值的差的绝对值最小,如果有相等的,则取值小的.并且已知所有数的id和valu ... 
- 安装laravel环境之homestead(for mac)
			1.先下载virtualbox + vagrant 2.执行命令 vagrant box add laravel/homestead 3.新建一个空文件夹,在里面下载代码.我是放在当前用户下的新建的W ... 
- 感觉shopex现在的升级方式太慢了
			我是说产品的更新,484,485是一个经典的版本,那时候免费,shopex 系统市场占用率很高.但是485以后呢,只有小版本的更新,fxw ,ekd 都是改进版本吧,没用特别大幅度的更新.5年前,10 ... 
- Java Mail 发送带有附件的邮件
			1.小编用的是163邮箱发送邮件,所以要先登录163邮箱开启POP3/SMTP/IMAP服务方法: 2.下载所需的java-mail 包 https://maven.java.net/content/ ... 
- Python--WebDriverWait+expected_conditions的一个应用
			from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.s ... 
- zabbix配置主动式监控的步骤(原创)
			步骤如下: 1.克隆模板.命名新的模板名,并点击"监控项",全选,批量更新时第一个“类型”打勾,客户端改为主动式: 2.添加客户端或更改原有的模板为新模板(服务器端添加客户端时的配 ... 
- 正则+re模块知识总结
			目录 正则表达式 定义+特点 元字符 量词 贪婪匹配与非贪婪匹配 转义符 re模块 re.findall re.search re.match re.compile re.finditer re.sp ... 
- 机器学习决策树ID3算法,手把手教你用Python实现
			本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第21篇文章,我们一起来看一个新的模型--决策树. 决策树的定义 决策树是我本人非常喜欢的机器学习模型,非常直观容易理解 ... 
- 笔记二(JavaWeb)
			上一个笔记写的好累,这次换Markdown试试 缺省适配器设计模式:父类不实现该方法,让子类去实现(抽象方法) 模板方法设计模式:定义一个操作中的方法骨架,而将一些步骤延迟到子类中.模板方法使得子类可 ... 
- 走迷宫(三):在XX限制条件下,是否走得出。
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目前提条件:让你输入一个数组,包含一个起点S,一个终点D,一个时间T.(其中X代表墙,.代表此 ... 
