流殃

实现一个简单的计算器

发布于

文章摘要

两个栈

public int calculate(String s) {
    Deque<Integer> stack = new LinkedList<Integer>();
    char preSign = '+';
    int num = 0;
    int n = s.length();
    for (int i = 0; i < n; ++i) {
        //判断这个字符是否是数字
        if (Character.isDigit(s.charAt(i))) {
            //字符和字符的加减法都是用的对应的ASCII来进行的,由于字符对应的ASCII码也是按照数字的大小来的,所以直接就相当于字符直接相加减
            num = num * 10 + s.charAt(i) - '0';
        }
        if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n - 1) {
            switch (preSign) {
                case '+':
                    stack.push(num);
                    break;
                case '-':
                    stack.push(-num);
                    break;
                case '*':
                    stack.push(stack.pop() * num);
                    break;
                default:
                    stack.push(stack.pop() / num);
            }
            preSign = s.charAt(i);
            num = 0;
        }
    }
    int ans = 0;
    while (!stack.isEmpty()) {
        ans += stack.pop();
    }
    return ans;
}

一个栈

public static  double calculate(String s)
{
    int len=s.length();
    char[] str=s.toCharArray();
    Stack<Integer> st_num=new Stack<>();
    char op='#';         //记录乘除符号
    int ans=0,sign=1;    //记录加减符号
    for(int i=0;i<len;i++){
        if(str[i]==' ') continue;
        if(str[i]>='0'&&str[i]<='9'){
            int num=str[i]-'0';
            while(i<len-1&&str[i+1]>='0'&&str[i+1]<='9')  //找完这个数
                num=num*10+(str[++i]-'0');
            if(op!='#'){                                //如果之前有乘除符号
                if(op=='*')num*=st_num.pop();           //则将这个数运算之后,再重新进栈
                else num=st_num.pop()/num;
                op='#';                                //重置乘除符号
            }
            st_num.push(num);
        }
        else if(str[i]=='*'||str[i]=='/') op=str[i];  //更新乘除符号
        else{                                         //遇到加减符号则可以直接更新ans了
            ans+=st_num.pop()*sign;
            sign=str[i]=='+'?1:-1;   //更新加减符号
        }
    }
    return ans+st_num.pop()*sign;   //sign更新后,还有一次未计算
}