Java表达式求值

import java.math.BigInteger;
import java.util.*;

public class Main
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext())
        {
            String str1 = scan.next();

            Stack<BigInteger> num = new Stack<BigInteger>();
            Stack<Character> op = new Stack<Character>();
            // +,-,*,/,^,()
            for(int i=0;i<str1.length();i++)
            {
                char ch = str1.charAt(i);
                switch(ch)
                {
                case ‘+‘:
                case ‘-‘:
                    // 这些优先级都大于等于当前操作符
                    while(!op.empty() &&
                            (op.peek()==‘+‘ ||
                            op.peek()==‘-‘ ||
                            op.peek()==‘*‘ ||
                            op.peek()==‘/‘ ||
                            op.peek()==‘^‘))
                    {
                        calc_stack(num, op);
                    }
                    op.push(ch);
                    break;
                case ‘*‘:
                case ‘/‘:
                    while(!op.empty() &&
                            (op.peek()==‘*‘ ||
                            op.peek()==‘/‘ ||
                            op.peek()==‘^‘))
                    {
                        calc_stack(num, op);
                    }
                    op.push(ch);
                    break;
                case ‘^‘:
                    while(!op.empty() && op.peek()==‘^‘)
                    {
                        calc_stack(num, op);
                    }
                    op.push(ch);
                    break;
                case ‘(‘:
                    op.push(ch);
                    break;
                case ‘)‘:
                    while(op.peek()!=‘(‘)
                    {
                        calc_stack(num, op);
                    }
                    // ‘(‘出栈
                    op.pop();
                    break;
                default:
                    String number = String.valueOf(ch);
                    while(i+1<str1.length() && Character.isDigit(str1.charAt(i+1)))
                    {
                        number +=String.valueOf(str1.charAt(i+1));
                        i++;
                    }
                    BigInteger big = new BigInteger(number);
                    num.push(big);
                    break;
                }
            }
            while(!op.empty())
            {
                calc_stack(num, op);
            }
            System.out.println(num.pop());
        }
        scan.close();
    }

    private static void calc_stack(Stack<BigInteger>num, Stack<Character>op)
    {
        char operator = op.pop();
        BigInteger num1 = num.pop();
        BigInteger num2 = num.pop();
        switch(operator)
        {
        case ‘+‘: num.push(num2.add(num1));break;
        case ‘-‘: num.push(num2.subtract(num1));break;
        case ‘*‘: num.push(num2.multiply(num1));break;
        case ‘/‘: num.push(num2.divide(num1));break;
        case ‘^‘: num.push(num2.pow(num1.intValue()));break;
        }
    }
}
时间: 2024-12-08 09:48:08

Java表达式求值的相关文章

java实现算术表达式求值

需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后缀表达式为32+,3*(2+1)的后缀表达式为:321+*,解决表达式求值首先需要根据字符串表达式求出后缀表达式,然后使用后缀表达式和操作数栈实现计算,计算的大致思想是从后缀表达式中取元素,如果元素是数值则加入到操作数栈中,如果是运算符则从操作数栈中取两个数来参与运算.后缀表达式的获取要借助于两个栈

表达式求值 - Java实现

本程序用于计算任意四则运算表达式.如 4 * ( 10 + 2 ) + 1 的结果应该为 49. 算法说明: 1. 首先定义运算符优先级.我们用一个 Map<String, Map<String, String>> 来保存优先级表.这样我们就可以通过下面的方式来计算两个运算符的优先级了: /** * 查表得到op1和op2的优先级 * @param op1 运算符1 * @param op2 运算符2 * @return ">", "<&q

奇怪的表达式求值 (java实现)

题目参考:http://blog.csdn.net/fuxuemingzhu/article/details/68484749 问题描述; 题目描述: 常规的表达式求值,我们都会根据计算的优先级来计算.比如*/的优先级就高于+-.但是小易所生活的世界的表达式规则很简单,从左往右依次计算即可,而且小易所在的世界没有除法,意味着表达式中没有/,只有(+, - 和 *).现在给出一个表达式,需要你帮忙计算出小易所在的世界这个表达式的值为多少  输入: 输入为一行字符串,即一个表达式.其中运算符只有-,

lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值

题目 逆波兰表达式求值 在逆波兰表达法中,其有效的运算符号包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰计数表达. 样例 ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"]

序列点在C语言表达式求值中的作用

摘要: 本文开创性地分析了序列点在C语言表达式求值中的作用:序列点左边的操作数要先于其右边的操作数求值.讨论了逗号操作符,.逻辑与操作符&&.逻辑或操作符||和条件操作符?:的问号处需要序列点的原因.举例分析了序列点在表达式求值中的作用. 关键字:序列点 表达式求值 C语言 C语言作为一种主流程序设计语言,许多编程语言如Java.C++.C#都借鉴了它的语法.C语言也是一种很适当的程序设计入门的教学语言,国内大专院校的许多专业都开设了这门课程并且大多将其作为第一门程序设计语言课程,同时C语

栈的应用—算术表达式求值

例三.算术表达式求值 1.问题描述 当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2.思路 首先我们要知道表达式分为三类:  ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-be ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单.所以,可

网易2017春招笔试真题编程题集合(8)——奇怪的表达式求值

常规的表达式求值,我们都会根据计算的优先级来计算.比如*/的优先级就高于+-.但是小易所生活的世界的表达式规则很简单,从左往右依次计算即可,而且小易所在的世界没有除法,意味着表达式中没有/,只有(+, - 和 *).现在给出一个表达式,需要你帮忙计算出小易所在的世界这个表达式的值为多少 输入描述: 输入为一行字符串,即一个表达式.其中运算符只有-,+,*.参与计算的数字只有0~9. 保证表达式都是合法的,排列规则如样例所示. 输出描述: 输出一个数,即表达式的值 输入例子: 3+5*7 输出例子

Matrix Chain Multiplication(表达式求值用栈操作)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1382    Accepted Submission(s): 905 Problem Description Matrix mul

Dijkstra的双栈算术表达式求值

import java.util.Stack; import java.util.Scanner; public class Evaluate { public static void main(String[] args) { Stack<String> ops=new Stack<String>(); Stack<Double> vals=new Stack<Double>(); Scanner cin=new Scanner(System.in); /