LQOJ ALGO-156 表达式计算

本文介绍了一种通过中缀表达式转换为后缀表达式的方法来计算数学表达式的值。使用了栈来处理运算符的优先级,并实现了整数除法等操作。适用于长度不超过100的合法表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表达式计算

问题描述

输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

输入格式
  
输入一行,包含一个表达式。

输出格式

输出这个表达式的值。

样例输入

1-2+3*(4-5)

样例输出

-4

数据规模和约定

表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

解题代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sr = new Scanner(System.in);
        Queue postfix = getPostfix(sr.next());
        int result = getResult(postfix);
        System.out.println(result);
    }

    private static int getResult(Queue postfix) {
        Stack<Integer> numbers = new Stack<Integer>();
        while(!postfix.isEmpty()){ 
            Object temp = postfix.poll();
            if(temp instanceof Integer)
                numbers.push((Integer)temp);
            else{
                int numB = numbers.pop();
                int numA = numbers.pop();
                switch ((Character)temp) {
                case '+':
                    numA += numB;
                    break;
                case '-':
                    numA -= numB;
                    break;
                case '*':
                    numA *= numB;
                    break;
                case '/':
                    numA /= numB;
                    break;
                }
                numbers.push(numA);
            }
        }
        return numbers.get(0);
    }

    private static Queue getPostfix(String ss) {
        Stack<Character> ops = new Stack<Character>();
        Queue<Object> postfixs = new LinkedList<Object>();
        for(int i=0;i<ss.length();i++){
            char temp = ss.charAt(i);
            if(Character.isDigit(temp)){
                int number = 0;
                while(i < ss.length() && Character.isDigit(ss.charAt(i))){
                    number = number*10 + Integer.parseInt(ss.substring(i,i+1));
                    i++;

                }
                i--;
                postfixs.offer(number);
            }
            else if(temp == '(')
                ops.push(temp);
            else if(temp == ')'){
                char popChar = ops.pop();
                while(popChar != '('){
                    postfixs.offer(popChar);
                    popChar = ops.pop();
                }
            }
            else{
                int rank = getRank(temp);
                if(ops.isEmpty() || rank > getRank(ops.peek()))
                    ops.push(temp);
                else {
                    while(!ops.isEmpty() && rank <= getRank(ops.peek()))
                        postfixs.offer(ops.pop());
                    ops.push(temp);
                }
            }
        }
        while(!ops.isEmpty())
            postfixs.offer(ops.pop());
        return postfixs;
    }

    private static int getRank(char c){
        switch (c) {
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
            return 2;
        }
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值