计算科学表达式

来源:互联网 发布:参观美术馆的作文300乎 编辑:程序博客网 时间:2024/04/28 19:27

前段时间去小米面试,让写一个计算表达式的值的代码  不考虑非法输入

由于是第一次参加面试,有些紧张,很蠢没很好的写出来。

回来看了看网上的代码也都好长,今天上午没事就写了一个比较精简的,自己试了些样例都还是正确的。

代码如下:

import java.util.Stack;public class ComputerString {public double computer(String str){char[]chs=str.toCharArray();Stack<Character> st=new Stack<Character>();for(char ch:chs){if(ch!=')') st.add(ch);else{Stack<Character> res=new Stack<Character>();char temp=st.pop();while(temp!='('){res.add(temp);temp=st.pop();}double sum=stackSum(res);st.add((char) (sum+'0'));}}Stack<Character> st1=new Stack<Character>();while(!st.isEmpty()) st1.add(st.pop());return stackSum(st1);}private double stackSum(Stack<Character> res) {if(res.isEmpty()) return 0;// TODO Auto-generated method stubStack<Double> stc=new Stack<Double>();stc.add((double) (res.pop()-'0'));while(!res.isEmpty()){char temp=res.pop();if(temp=='*')stc.add(stc.pop()*(res.pop()-'0'));else if(temp=='/')stc.add(stc.pop()/(res.pop()-'0'));else if(temp=='+')stc.add((double) (res.pop()-'0'));elsestc.add((double) ((res.pop()-'0')*-1));}double sum=0.00;while(!stc.isEmpty())sum+=stc.pop();return sum;}public static void main(String[] args){ComputerString cs=new ComputerString ();String str="(1+2)+3*3/(1+3)*2";System.out.printf("%.2f",cs.computer(str));}}
唯一要注意打的是 char 与double、int的互转

char-》int  ch-'0';

int-char (char)(int+'0')

0 0
原创粉丝点击