**四则运算

题目描述:

四则运算

输入描述:

输入一个算术表达式

输出描述:

得到计算结果

思路:

栈的应用:

中缀表达式转后缀表达式:

规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

后缀表达式计算结果:

规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。

1、多位数

2、负数

import java.util.*;

public class Main
{

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext())
        {
            String str = scanner.nextLine();
            str = convert(str); //若'-'表示负数,在前面加上0
            ArrayList<String> suffix = infixToSuffix(getExpress(str)); //中缀变后缀表达式
            int num = suffixToNum(suffix); //计算后缀表达式
            System.out.println(num);
        }
    }
    public static String convert(String str)
    {
        for (int i = 0; i < str.length(); i++)
        {
            if (i == 0 && str.charAt(i) == '-')
                str = "0" + str;
            else if (i > 0 && str.charAt(i) == '-' && !(str.charAt(i - 1) >= '0' && str.charAt(i - 1) <= '9') && str.charAt(i - 1) != ')')
                str = str.substring(0, i) + "0" + str.substring(i);
        }
        return str;
    }

    public static String getExpress(String str)
    {
        str = str.replace('{', '(');
        str = str.replace('[', '(');
        str = str.replace('}', ')');
        str = str.replace(']', ')');

        StringBuffer sb = new StringBuffer();
        for (char c: str.toCharArray()) //在运算符前后加上空格,以便区别
        {
            if (c == '(' || c== ')' || c == '+' || c == '-' || c == '*' || c == '/')
            {
                sb.append(" ");
                sb.append(c);
                sb.append(" ");
            }
            else
                sb.append(c);
        }
        String res = sb.toString().trim();
        return res;
    }


    public static ArrayList<String> infixToSuffix(String str)
    {
        String[] strs = str.split("\\s+");

        ArrayList<String> list = new ArrayList<>();
        Stack<String> stack = new Stack<>();
        for (String s: strs)
        {
            switch (s)
            {
                case "(":
                    stack.push(s);
                    break;
                case "+":
                case "-":
                    while (!stack.isEmpty())
                    {
                        String tmp = stack.pop();
                        if (tmp.equals("(")) {
                            stack.push(tmp);
                            break;
                        }
                        else
                            list.add(tmp);
                    }
                    stack.push(s);
                    break;
                case "*":
                case "/":
                    while (!stack.isEmpty())
                    {
                        String tmp = stack.pop();
                        if (tmp.equals("(") || tmp.equals("+") || tmp.equals("-"))
                        {
                            stack.push(tmp);
                            break;
                        }
                        else
                            list.add(tmp);
                    }
                    stack.push(s);
                    break;
                case ")":
                    while (!stack.isEmpty())
                    {
                        String tmp = stack.pop();
                        if (tmp.equals("("))
                            break;
                        else
                            list.add(tmp);
                    }
                    break;
                default:
                    list.add(s);
                    break;
            }
        }
        while (!stack.isEmpty())
            list.add(stack.pop());
        return list;
    }

    public static int suffixToNum(ArrayList<String> list)
    {
        Stack<Integer> stack = new Stack<>();
        for (String s: list)
        {
            if (s.charAt(0) >= '0' && s.charAt(0) <= '9')
                stack.push(Integer.valueOf(s));
            else if (stack.size() >= 2)
            {
                int num1 = stack.pop();
                int num2 = stack.pop();
                switch (s)
                {
                    case "+":
                        stack.push(num2 + num1);
                        break;
                    case "-":
                        stack.push(num2 - num1);
                        break;
                    case "*":
                        stack.push(num2 * num1);
                        break;
                    case "/":
                        stack.push(num2 / num1);
                        break;
                }
            }
        }
        return stack.pop();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值