227. Basic Calculator II

本文介绍了一个使用栈数据结构实现的基本计算器算法,用于解析并计算简单的数学表达式字符串,包括加、减、乘、除运算及整数除法的取整处理。
Description

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.

Example 1:

Input: “3+2*2”
Output: 7

Example 2:

Input: " 3/2 "
Output: 1

Example 3:

Input: " 3+5 / 2 "
Output: 5

Note:

  • You may assume that the given expression is always valid.
  • Do not use the eval built-in library function.

Problem URL


Solution

给一串string表示的算式,其中可能有空格,计算它的结果。

We use a stack to help us calculate multiple and divide. For every character in s, If it is a number, then we have to rebuild this number. num = num * 10 + c - ‘0’. If it is not a number and not a space, or it is the last character, which means we have to end the calculation.

We use plus as initial sign. When processed to a non-digit character, if it is + or -, we simply push it to stack. If it is * or /, we have to calculate with last number, which stores on the top of the stack. After that, we assign new sign with character and num = 0.

The sum of the numbers in stack is the final answer.

Code
class Solution {
    public int calculate(String s) {
        if (s.length() == 0)
            return 0;
        Stack<Integer> stack = new Stack<>();
        int num = 0;
        char sign = '+';
        for (int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if (Character.isDigit(c)){
                num = num * 10 + c - '0';
            }
            if ((!Character.isDigit(c) && c != ' ') || i == s.length() - 1){
                if (sign == '+'){
                    stack.push(num);
                }
                else if (sign == '-'){
                    stack.push(-num);
                }
                else if (sign == '*'){
                    stack.push(stack.pop() * num);
                }
                else if (sign == '/'){
                    stack.push(stack.pop() / num);
                }
                sign = c;
                num = 0;
            }
        }
        int result = 0;
        for (int i : stack){
            result += i;
        }
        return result;
    }
}

Time Complexity: O(n)
Space Complexity: O(n)


Review
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值