表达式求值(2021携程春招笔试)

表达式求值

题目

  • 给一个字符串,包含(),整数,"±*"三个符号.如(+ 5 4);
  • 请将给定的字符串求值,每个表达式中,有一个操作符,两个以上的操作数,操作数可能是整数也可能是一个表达式.

思路

  • 并没有什么好说的,简单模拟即可,这题麻烦就在输入输出.
  • Scanner类无法单字符读取,所以在此将其处理为一条带空格的字符串,使用sc.useDelimiter("\n");

代码

import java.util.*;

public class Main{

    public static void main(String[] args)
    {
        Stack<String> s = new Stack<>();
        Scanner sc = new Scanner(System.in);
        sc.useDelimiter("\n");
        String question = sc.nextLine();
        System.out.println(question);
        ArrayList<String> a = new ArrayList<>();
        int index = 0;
        while (index<question.length())
        {
            s.push(Character.toString(question.charAt(index)));
            System.out.println(s);
            if(s.peek().equals(")"))
            {
                s.pop();
                while (!s.peek().equals("("))
                {
                    a.add(s.pop());
                }
                s.pop();//取出括号内表达式
                System.out.println(a);
                s.push(Calculate(a));//能确保只有一个是表达式
                a.clear();
            }
            index++;
        }

        System.out.println(s.peek());


    }

    private static String Calculate(ArrayList<String> a) {
        Character operator = ' ';
        ArrayList<Integer> o = new ArrayList<Integer>();
        for(int i=a.size()-1;i>=0;i--)
        {
            if (a.get(i).equals("+")|| a.get(i).equals("-")||a.get(i).equals("*"))
            {
                operator=a.get(i).charAt(0);
            }
            else  if(a.get(i).equals(" "))
            {
                continue;
            }
            else if (Integer.parseInt(a.get(i))>=0&&Integer.parseInt(a.get(i))<=9&&a.get(i+1).equals(" "))//???未说明是否有负数
            {
                int x=Integer.parseInt(a.get(i));
                int j=i-1;
                while (j>0&&!a.get(j).equals(" "))
                {
                    x=x*10+Integer.parseInt(a.get(j));
                    j--;
                }
                o.add(x);
                System.out.println(o);
                i=j+1;

            }
        }
        int ans=0;
        switch (operator)
        {
            case '+':
                for (int i:o)
                    ans+=i;
                break;
            case '-':
                ans=o.get(0);
                for (int i=1;i<o.size();i++)
                    ans-=o.get(i);
                break;
            case '*':
                ans=o.get(0);
                for (int i=1;i<o.size();i++)
                    ans*=o.get(i);
                break;
        }

        return Integer.toString(ans);

    }

}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值